xref: /openbsd/sys/dev/pci/drm/i915/intel_stolen.c (revision f005ef32)
17f4dd379Sjsg /* Public domain. */
27f4dd379Sjsg 
37f4dd379Sjsg #include <linux/types.h>
47f4dd379Sjsg #include <linux/ioport.h>
57f4dd379Sjsg #include <linux/pci.h>
67f4dd379Sjsg #include <drm/i915_drm.h>
77f4dd379Sjsg #include "i915_drv.h"
87f4dd379Sjsg 
97f4dd379Sjsg struct resource intel_graphics_stolen_res = DEFINE_RES_MEM(0, 0);
107f4dd379Sjsg 
117f4dd379Sjsg bus_addr_t
gen3_stolen_base(struct inteldrm_softc * dev_priv)127f4dd379Sjsg gen3_stolen_base(struct inteldrm_softc *dev_priv)
137f4dd379Sjsg {
147f4dd379Sjsg 	uint32_t bsm = pci_conf_read(dev_priv->pc, dev_priv->tag,
157f4dd379Sjsg 	    INTEL_BSM);
167f4dd379Sjsg 	return bsm & INTEL_BSM_MASK;
177f4dd379Sjsg }
187f4dd379Sjsg 
197f4dd379Sjsg bus_addr_t
gen11_stolen_base(struct inteldrm_softc * dev_priv)207f4dd379Sjsg gen11_stolen_base(struct inteldrm_softc *dev_priv)
217f4dd379Sjsg {
227f4dd379Sjsg 	uint64_t bsm = pci_conf_read(dev_priv->pc, dev_priv->tag,
237f4dd379Sjsg 	    INTEL_GEN11_BSM_DW0);
247f4dd379Sjsg 	bsm &= INTEL_BSM_MASK;
257f4dd379Sjsg 	bsm |= (uint64_t)pci_conf_read(dev_priv->pc, dev_priv->tag,
267f4dd379Sjsg 	    INTEL_GEN11_BSM_DW1) << 32;
277f4dd379Sjsg 	return bsm;
287f4dd379Sjsg }
297f4dd379Sjsg 
307f4dd379Sjsg bus_size_t
i830_stolen_size(struct inteldrm_softc * dev_priv)317f4dd379Sjsg i830_stolen_size(struct inteldrm_softc *dev_priv)
327f4dd379Sjsg {
337f4dd379Sjsg 	uint16_t gmch_ctl, gms;
347f4dd379Sjsg 
35*f005ef32Sjsg 	pci_read_config_word(dev_priv->gmch.pdev, I830_GMCH_CTRL,
367f4dd379Sjsg 	    &gmch_ctl);
377f4dd379Sjsg 	gms = gmch_ctl & I830_GMCH_GMS_MASK;
387f4dd379Sjsg 
397f4dd379Sjsg 	switch (gms) {
407f4dd379Sjsg 	case I830_GMCH_GMS_STOLEN_512:
417f4dd379Sjsg 		return 512 * 1024;
427f4dd379Sjsg 	case I830_GMCH_GMS_STOLEN_1024:
437f4dd379Sjsg 		return 1 * 1024 * 1024;
447f4dd379Sjsg 	case I830_GMCH_GMS_STOLEN_8192:
457f4dd379Sjsg 		return 8 * 1024 * 1024;
467f4dd379Sjsg 	}
477f4dd379Sjsg 
487f4dd379Sjsg 	return 0;
497f4dd379Sjsg }
507f4dd379Sjsg 
517f4dd379Sjsg bus_size_t
gen3_stolen_size(struct inteldrm_softc * dev_priv)527f4dd379Sjsg gen3_stolen_size(struct inteldrm_softc *dev_priv)
537f4dd379Sjsg {
547f4dd379Sjsg 	uint16_t gmch_ctl, gms;
557f4dd379Sjsg 
56*f005ef32Sjsg 	pci_read_config_word(dev_priv->gmch.pdev, I830_GMCH_CTRL,
577f4dd379Sjsg 	    &gmch_ctl);
587f4dd379Sjsg 	gms = gmch_ctl & I855_GMCH_GMS_MASK;
597f4dd379Sjsg 
607f4dd379Sjsg 	switch (gms) {
617f4dd379Sjsg 	case I855_GMCH_GMS_STOLEN_1M:
627f4dd379Sjsg 		return 1 * 1024 * 1024;
637f4dd379Sjsg 	case I855_GMCH_GMS_STOLEN_4M:
647f4dd379Sjsg 		return 4 * 1024 * 1024;
657f4dd379Sjsg 	case I855_GMCH_GMS_STOLEN_8M:
667f4dd379Sjsg 		return 8 * 1024 * 1024;
677f4dd379Sjsg 	case I855_GMCH_GMS_STOLEN_16M:
687f4dd379Sjsg 		return 16 * 1024 * 1024;
697f4dd379Sjsg 	case I855_GMCH_GMS_STOLEN_32M:
707f4dd379Sjsg 		return 32 * 1024 * 1024;
717f4dd379Sjsg 	case I915_GMCH_GMS_STOLEN_48M:
727f4dd379Sjsg 		return 48 * 1024 * 1024;
737f4dd379Sjsg 	case I915_GMCH_GMS_STOLEN_64M:
747f4dd379Sjsg 		return 64 * 1024 * 1024;
757f4dd379Sjsg 	case G33_GMCH_GMS_STOLEN_128M:
767f4dd379Sjsg 		return 128 * 1024 * 1024;
777f4dd379Sjsg 	case G33_GMCH_GMS_STOLEN_256M:
787f4dd379Sjsg 		return 256 * 1024 * 1024;
797f4dd379Sjsg 	case INTEL_GMCH_GMS_STOLEN_96M:
807f4dd379Sjsg 		return 96 * 1024 * 1024;
817f4dd379Sjsg 	case INTEL_GMCH_GMS_STOLEN_160M:
827f4dd379Sjsg 		return 160 * 1024 * 1024;
837f4dd379Sjsg 	case INTEL_GMCH_GMS_STOLEN_224M:
847f4dd379Sjsg 		return 224 * 1024 * 1024;
857f4dd379Sjsg 	case INTEL_GMCH_GMS_STOLEN_352M:
867f4dd379Sjsg 		return 352 * 1024 * 1024;
877f4dd379Sjsg 	}
887f4dd379Sjsg 
897f4dd379Sjsg 	return 0;
907f4dd379Sjsg }
917f4dd379Sjsg 
927f4dd379Sjsg bus_size_t
gen6_stolen_size(struct inteldrm_softc * dev_priv)937f4dd379Sjsg gen6_stolen_size(struct inteldrm_softc *dev_priv)
947f4dd379Sjsg {
957f4dd379Sjsg 	struct pci_dev *pdev = dev_priv->drm.pdev;
967f4dd379Sjsg 	uint16_t gmch_ctl, gms;
977f4dd379Sjsg 
987f4dd379Sjsg 	pci_read_config_word(pdev, SNB_GMCH_CTRL, &gmch_ctl);
997f4dd379Sjsg 	gms = (gmch_ctl >> SNB_GMCH_GMS_SHIFT) & SNB_GMCH_GMS_MASK;
1007f4dd379Sjsg 
1017f4dd379Sjsg 	return gms * (32 * 1024 * 1024);
1027f4dd379Sjsg }
1037f4dd379Sjsg 
1047f4dd379Sjsg bus_size_t
chv_stolen_size(struct inteldrm_softc * dev_priv)1057f4dd379Sjsg chv_stolen_size(struct inteldrm_softc *dev_priv)
1067f4dd379Sjsg {
1077f4dd379Sjsg 	struct pci_dev *pdev = dev_priv->drm.pdev;
1087f4dd379Sjsg 	uint16_t gmch_ctl, gms;
1097f4dd379Sjsg 
1107f4dd379Sjsg 	pci_read_config_word(pdev, SNB_GMCH_CTRL, &gmch_ctl);
1117f4dd379Sjsg 	gms = (gmch_ctl >> SNB_GMCH_GMS_SHIFT) & SNB_GMCH_GMS_MASK;
1127f4dd379Sjsg 
1137f4dd379Sjsg 	if (gms < 0x11)
1147f4dd379Sjsg 		return gms * (32 * 1024 * 1024);
1157f4dd379Sjsg 	else if (gms < 0x17)
1167f4dd379Sjsg 		return (gms - 0x11) * (4 * 1024 * 1024) + (8 * 1024 * 1024);
1177f4dd379Sjsg 	else
1187f4dd379Sjsg 		return (gms - 0x17) + (4 * 1024 * 1024) + (36 * 1024 * 1024);
1197f4dd379Sjsg }
1207f4dd379Sjsg 
1217f4dd379Sjsg bus_size_t
gen8_stolen_size(struct inteldrm_softc * dev_priv)1227f4dd379Sjsg gen8_stolen_size(struct inteldrm_softc *dev_priv)
1237f4dd379Sjsg {
1247f4dd379Sjsg 	struct pci_dev *pdev = dev_priv->drm.pdev;
1257f4dd379Sjsg 	uint16_t gmch_ctl, gms;
1267f4dd379Sjsg 
1277f4dd379Sjsg 	pci_read_config_word(pdev, SNB_GMCH_CTRL, &gmch_ctl);
1287f4dd379Sjsg 	gms = (gmch_ctl >> BDW_GMCH_GMS_SHIFT) & BDW_GMCH_GMS_MASK;
1297f4dd379Sjsg 
1307f4dd379Sjsg 	return gms * (32 * 1024 * 1024);
1317f4dd379Sjsg }
1327f4dd379Sjsg 
1337f4dd379Sjsg bus_size_t
gen9_stolen_size(struct inteldrm_softc * dev_priv)1347f4dd379Sjsg gen9_stolen_size(struct inteldrm_softc *dev_priv)
1357f4dd379Sjsg {
1367f4dd379Sjsg 	struct pci_dev *pdev = dev_priv->drm.pdev;
1377f4dd379Sjsg 	uint16_t gmch_ctl, gms;
1387f4dd379Sjsg 
1397f4dd379Sjsg 	pci_read_config_word(pdev, SNB_GMCH_CTRL, &gmch_ctl);
1407f4dd379Sjsg 	gms = (gmch_ctl >> BDW_GMCH_GMS_SHIFT) & BDW_GMCH_GMS_MASK;
1417f4dd379Sjsg 	if (gms < 0xf0)
1427f4dd379Sjsg 		return gms * (32 * 1024 * 1024);
1437f4dd379Sjsg 	else
1447f4dd379Sjsg 		return (gms - 0xf0) * (4 * 1024 * 1024) + (4 * 1024 * 1024);
1457f4dd379Sjsg }
1467f4dd379Sjsg 
1477f4dd379Sjsg void
intel_init_stolen_res(struct inteldrm_softc * dev_priv)1487f4dd379Sjsg intel_init_stolen_res(struct inteldrm_softc *dev_priv)
1497f4dd379Sjsg {
1507f4dd379Sjsg 	bus_addr_t stolen_base = 0;
1517f4dd379Sjsg 	bus_size_t stolen_size = 0;
1527f4dd379Sjsg 
1537f4dd379Sjsg #ifdef notyet
1547f4dd379Sjsg 	if (IS_I830(dev_priv))
1557f4dd379Sjsg 		stolen_base  = i830_stolen_base(dev_priv);
1567f4dd379Sjsg 	else if (IS_I845G(dev_priv))
1577f4dd379Sjsg 		stolen_base  = i845_stolen_base(dev_priv);
1587f4dd379Sjsg 	else if (IS_I85X(dev_priv))
1597f4dd379Sjsg 		stolen_base  = i85x_stolen_base(dev_priv);
1607f4dd379Sjsg 	else if (IS_I865G(dev_priv))
1617f4dd379Sjsg 		stolen_base  = i865_stolen_base(dev_priv);
1627f4dd379Sjsg #endif
1637f4dd379Sjsg 
1645ca02815Sjsg 	if (GRAPHICS_VER(dev_priv) >= 3 && GRAPHICS_VER(dev_priv) < 11)
1657f4dd379Sjsg 		stolen_base  = gen3_stolen_base(dev_priv);
166b54194e2Sjsg 	else if (GRAPHICS_VER(dev_priv) == 11 || GRAPHICS_VER(dev_priv) == 12)
1677f4dd379Sjsg 		stolen_base = gen11_stolen_base(dev_priv);
1687f4dd379Sjsg 
1697f4dd379Sjsg 	if (IS_I830(dev_priv) || IS_I845G(dev_priv))
1707f4dd379Sjsg 		stolen_size = i830_stolen_size(dev_priv);
1717f4dd379Sjsg 	else if (IS_I85X(dev_priv) || IS_I865G(dev_priv) ||
1725ca02815Sjsg 	    (GRAPHICS_VER(dev_priv) >= 3 && GRAPHICS_VER(dev_priv) <= 5))
1737f4dd379Sjsg 		stolen_size = gen3_stolen_size(dev_priv);
1747f4dd379Sjsg 	else if (IS_CHERRYVIEW(dev_priv))
1757f4dd379Sjsg 		stolen_size = chv_stolen_size(dev_priv);
1765ca02815Sjsg 	else if (GRAPHICS_VER(dev_priv) >= 6 && GRAPHICS_VER(dev_priv) < 8)
1777f4dd379Sjsg 		stolen_size = gen6_stolen_size(dev_priv);
1785ca02815Sjsg 	else if (GRAPHICS_VER(dev_priv) == 8)
1797f4dd379Sjsg 		stolen_size = gen8_stolen_size(dev_priv);
180b54194e2Sjsg 	else if (GRAPHICS_VER(dev_priv) >= 9 && GRAPHICS_VER(dev_priv) <= 12)
1817f4dd379Sjsg 		stolen_size = gen9_stolen_size(dev_priv);
1827f4dd379Sjsg 
1837f4dd379Sjsg 	if (stolen_base == 0 || stolen_size == 0)
1847f4dd379Sjsg 		return;
1857f4dd379Sjsg 
1867f4dd379Sjsg 	intel_graphics_stolen_res.start = stolen_base;
1877f4dd379Sjsg 	intel_graphics_stolen_res.end = stolen_base + stolen_size - 1;
1887f4dd379Sjsg }
189