Commit a2ac09a0 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/core: allow detected chipset to be overridden



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent a0b694d0
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -631,7 +631,8 @@ static int nouveau_drm_probe(struct pci_dev *pdev,
	/* We need to check that the chipset is supported before booting
	/* We need to check that the chipset is supported before booting
	 * fbdev off the hardware, as there's no way to put it back.
	 * fbdev off the hardware, as there's no way to put it back.
	 */
	 */
	ret = nvkm_device_pci_new(pdev, NULL, "error", true, false, 0, &device);
	ret = nvkm_device_pci_new(pdev, nouveau_config, "error",
				  true, false, 0, &device);
	if (ret)
	if (ret)
		return ret;
		return ret;


+22 −2
Original line number Original line Diff line number Diff line
@@ -2824,8 +2824,8 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
	u64 mmio_base, mmio_size;
	u64 mmio_base, mmio_size;
	u32 boot0, strap;
	u32 boot0, strap;
	void __iomem *map;
	void __iomem *map;
	int ret = -EEXIST;
	int ret = -EEXIST, i;
	int i;
	unsigned chipset;


	mutex_lock(&nv_devices_mutex);
	mutex_lock(&nv_devices_mutex);
	if (nvkm_device_find_locked(handle))
	if (nvkm_device_find_locked(handle))
@@ -2870,6 +2870,26 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
		strap = ioread32_native(map + 0x101000);
		strap = ioread32_native(map + 0x101000);
		iounmap(map);
		iounmap(map);


		/* chipset can be overridden for devel/testing purposes */
		chipset = nvkm_longopt(device->cfgopt, "NvChipset", 0);
		if (chipset) {
			u32 override_boot0;

			if (chipset >= 0x10) {
				override_boot0  = ((chipset & 0x1ff) << 20);
				override_boot0 |= 0x000000a1;
			} else {
				if (chipset != 0x04)
					override_boot0 = 0x20104000;
				else
					override_boot0 = 0x20004000;
			}

			nvdev_warn(device, "CHIPSET OVERRIDE: %08x -> %08x\n",
				   boot0, override_boot0);
			boot0 = override_boot0;
		}

		/* determine chipset and derive architecture from it */
		/* determine chipset and derive architecture from it */
		if ((boot0 & 0x1f000000) > 0) {
		if ((boot0 & 0x1f000000) > 0) {
			device->chipset = (boot0 & 0x1ff00000) >> 20;
			device->chipset = (boot0 & 0x1ff00000) >> 20;