Commit 00fe639a authored by Ville Syrjälä's avatar Ville Syrjälä Committed by Daniel Vetter

drm/i915: Make AGP support optional

We only depend on the intel-gtt module for GTT frobbign on older gens.
The intel_agp module is optional, except for UMS and some old XvMC
userland on gen3. So make AGP support optional. As before, we will
fail the i915 init for UMS and gen3 KMS the same as before if
intel_agp isn't around.

intel-gtt.c is left with a somewhat ugly ifdef mess, but I'm going
to save that for a later cleaning.

At least my gen2 still works with the patch and CONFIG_AGP=n.

v2: Make i915 depend on X86 and PCI, and intel-gtt depend on PCI
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent ab3c759a
...@@ -50,7 +50,7 @@ obj-$(CONFIG_GPIO_TB0219) += tb0219.o ...@@ -50,7 +50,7 @@ obj-$(CONFIG_GPIO_TB0219) += tb0219.o
obj-$(CONFIG_TELCLOCK) += tlclk.o obj-$(CONFIG_TELCLOCK) += tlclk.o
obj-$(CONFIG_MWAVE) += mwave/ obj-$(CONFIG_MWAVE) += mwave/
obj-$(CONFIG_AGP) += agp/ obj-y += agp/
obj-$(CONFIG_PCMCIA) += pcmcia/ obj-$(CONFIG_PCMCIA) += pcmcia/
obj-$(CONFIG_HANGCHECK_TIMER) += hangcheck-timer.o obj-$(CONFIG_HANGCHECK_TIMER) += hangcheck-timer.o
......
...@@ -68,6 +68,7 @@ config AGP_AMD64 ...@@ -68,6 +68,7 @@ config AGP_AMD64
config AGP_INTEL config AGP_INTEL
tristate "Intel 440LX/BX/GX, I8xx and E7x05 chipset support" tristate "Intel 440LX/BX/GX, I8xx and E7x05 chipset support"
depends on AGP && X86 depends on AGP && X86
select INTEL_GTT
help help
This option gives you AGP support for the GLX component of X This option gives you AGP support for the GLX component of X
on Intel 440LX/BX/GX, 815, 820, 830, 840, 845, 850, 860, 875, on Intel 440LX/BX/GX, 815, 820, 830, 840, 845, 850, 860, 875,
...@@ -155,3 +156,7 @@ config AGP_SGI_TIOCA ...@@ -155,3 +156,7 @@ config AGP_SGI_TIOCA
This option gives you AGP GART support for the SGI TIO chipset This option gives you AGP GART support for the SGI TIO chipset
for IA64 processors. for IA64 processors.
config INTEL_GTT
tristate
depends on X86 && PCI
...@@ -13,7 +13,7 @@ obj-$(CONFIG_AGP_HP_ZX1) += hp-agp.o ...@@ -13,7 +13,7 @@ obj-$(CONFIG_AGP_HP_ZX1) += hp-agp.o
obj-$(CONFIG_AGP_PARISC) += parisc-agp.o obj-$(CONFIG_AGP_PARISC) += parisc-agp.o
obj-$(CONFIG_AGP_I460) += i460-agp.o obj-$(CONFIG_AGP_I460) += i460-agp.o
obj-$(CONFIG_AGP_INTEL) += intel-agp.o obj-$(CONFIG_AGP_INTEL) += intel-agp.o
obj-$(CONFIG_AGP_INTEL) += intel-gtt.o obj-$(CONFIG_INTEL_GTT) += intel-gtt.o
obj-$(CONFIG_AGP_NVIDIA) += nvidia-agp.o obj-$(CONFIG_AGP_NVIDIA) += nvidia-agp.o
obj-$(CONFIG_AGP_SGI_TIOCA) += sgi-agp.o obj-$(CONFIG_AGP_SGI_TIOCA) += sgi-agp.o
obj-$(CONFIG_AGP_SIS) += sis-agp.o obj-$(CONFIG_AGP_SIS) += sis-agp.o
......
...@@ -94,6 +94,7 @@ static struct _intel_private { ...@@ -94,6 +94,7 @@ static struct _intel_private {
#define IS_IRONLAKE intel_private.driver->is_ironlake #define IS_IRONLAKE intel_private.driver->is_ironlake
#define HAS_PGTBL_EN intel_private.driver->has_pgtbl_enable #define HAS_PGTBL_EN intel_private.driver->has_pgtbl_enable
#if IS_ENABLED(CONFIG_AGP_INTEL)
static int intel_gtt_map_memory(struct page **pages, static int intel_gtt_map_memory(struct page **pages,
unsigned int num_entries, unsigned int num_entries,
struct sg_table *st) struct sg_table *st)
...@@ -168,6 +169,7 @@ static void i8xx_destroy_pages(struct page *page) ...@@ -168,6 +169,7 @@ static void i8xx_destroy_pages(struct page *page)
__free_pages(page, 2); __free_pages(page, 2);
atomic_dec(&agp_bridge->current_memory_agp); atomic_dec(&agp_bridge->current_memory_agp);
} }
#endif
#define I810_GTT_ORDER 4 #define I810_GTT_ORDER 4
static int i810_setup(void) static int i810_setup(void)
...@@ -209,6 +211,7 @@ static void i810_cleanup(void) ...@@ -209,6 +211,7 @@ static void i810_cleanup(void)
free_gatt_pages(intel_private.i81x_gtt_table, I810_GTT_ORDER); free_gatt_pages(intel_private.i81x_gtt_table, I810_GTT_ORDER);
} }
#if IS_ENABLED(CONFIG_AGP_INTEL)
static int i810_insert_dcache_entries(struct agp_memory *mem, off_t pg_start, static int i810_insert_dcache_entries(struct agp_memory *mem, off_t pg_start,
int type) int type)
{ {
...@@ -289,6 +292,7 @@ static void intel_i810_free_by_type(struct agp_memory *curr) ...@@ -289,6 +292,7 @@ static void intel_i810_free_by_type(struct agp_memory *curr)
} }
kfree(curr); kfree(curr);
} }
#endif
static int intel_gtt_setup_scratch_page(void) static int intel_gtt_setup_scratch_page(void)
{ {
...@@ -647,7 +651,9 @@ static int intel_gtt_init(void) ...@@ -647,7 +651,9 @@ static int intel_gtt_init(void)
return -ENOMEM; return -ENOMEM;
} }
#if IS_ENABLED(CONFIG_AGP_INTEL)
global_cache_flush(); /* FIXME: ? */ global_cache_flush(); /* FIXME: ? */
#endif
intel_private.stolen_size = intel_gtt_stolen_size(); intel_private.stolen_size = intel_gtt_stolen_size();
...@@ -671,6 +677,7 @@ static int intel_gtt_init(void) ...@@ -671,6 +677,7 @@ static int intel_gtt_init(void)
return 0; return 0;
} }
#if IS_ENABLED(CONFIG_AGP_INTEL)
static int intel_fake_agp_fetch_size(void) static int intel_fake_agp_fetch_size(void)
{ {
int num_sizes = ARRAY_SIZE(intel_fake_agp_sizes); int num_sizes = ARRAY_SIZE(intel_fake_agp_sizes);
...@@ -689,6 +696,7 @@ static int intel_fake_agp_fetch_size(void) ...@@ -689,6 +696,7 @@ static int intel_fake_agp_fetch_size(void)
return 0; return 0;
} }
#endif
static void i830_cleanup(void) static void i830_cleanup(void)
{ {
...@@ -801,6 +809,7 @@ static int i830_setup(void) ...@@ -801,6 +809,7 @@ static int i830_setup(void)
return 0; return 0;
} }
#if IS_ENABLED(CONFIG_AGP_INTEL)
static int intel_fake_agp_create_gatt_table(struct agp_bridge_data *bridge) static int intel_fake_agp_create_gatt_table(struct agp_bridge_data *bridge)
{ {
agp_bridge->gatt_table_real = NULL; agp_bridge->gatt_table_real = NULL;
...@@ -825,6 +834,7 @@ static int intel_fake_agp_configure(void) ...@@ -825,6 +834,7 @@ static int intel_fake_agp_configure(void)
return 0; return 0;
} }
#endif
static bool i830_check_flags(unsigned int flags) static bool i830_check_flags(unsigned int flags)
{ {
...@@ -863,6 +873,7 @@ void intel_gtt_insert_sg_entries(struct sg_table *st, ...@@ -863,6 +873,7 @@ void intel_gtt_insert_sg_entries(struct sg_table *st,
} }
EXPORT_SYMBOL(intel_gtt_insert_sg_entries); EXPORT_SYMBOL(intel_gtt_insert_sg_entries);
#if IS_ENABLED(CONFIG_AGP_INTEL)
static void intel_gtt_insert_pages(unsigned int first_entry, static void intel_gtt_insert_pages(unsigned int first_entry,
unsigned int num_entries, unsigned int num_entries,
struct page **pages, struct page **pages,
...@@ -928,6 +939,7 @@ static int intel_fake_agp_insert_entries(struct agp_memory *mem, ...@@ -928,6 +939,7 @@ static int intel_fake_agp_insert_entries(struct agp_memory *mem,
mem->is_flushed = true; mem->is_flushed = true;
return ret; return ret;
} }
#endif
void intel_gtt_clear_range(unsigned int first_entry, unsigned int num_entries) void intel_gtt_clear_range(unsigned int first_entry, unsigned int num_entries)
{ {
...@@ -941,6 +953,7 @@ void intel_gtt_clear_range(unsigned int first_entry, unsigned int num_entries) ...@@ -941,6 +953,7 @@ void intel_gtt_clear_range(unsigned int first_entry, unsigned int num_entries)
} }
EXPORT_SYMBOL(intel_gtt_clear_range); EXPORT_SYMBOL(intel_gtt_clear_range);
#if IS_ENABLED(CONFIG_AGP_INTEL)
static int intel_fake_agp_remove_entries(struct agp_memory *mem, static int intel_fake_agp_remove_entries(struct agp_memory *mem,
off_t pg_start, int type) off_t pg_start, int type)
{ {
...@@ -982,6 +995,7 @@ static struct agp_memory *intel_fake_agp_alloc_by_type(size_t pg_count, ...@@ -982,6 +995,7 @@ static struct agp_memory *intel_fake_agp_alloc_by_type(size_t pg_count,
/* always return NULL for other allocation types for now */ /* always return NULL for other allocation types for now */
return NULL; return NULL;
} }
#endif
static int intel_alloc_chipset_flush_resource(void) static int intel_alloc_chipset_flush_resource(void)
{ {
...@@ -1138,6 +1152,7 @@ static int i9xx_setup(void) ...@@ -1138,6 +1152,7 @@ static int i9xx_setup(void)
return 0; return 0;
} }
#if IS_ENABLED(CONFIG_AGP_INTEL)
static const struct agp_bridge_driver intel_fake_agp_driver = { static const struct agp_bridge_driver intel_fake_agp_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.size_type = FIXED_APER_SIZE, .size_type = FIXED_APER_SIZE,
...@@ -1159,6 +1174,7 @@ static const struct agp_bridge_driver intel_fake_agp_driver = { ...@@ -1159,6 +1174,7 @@ static const struct agp_bridge_driver intel_fake_agp_driver = {
.agp_destroy_page = agp_generic_destroy_page, .agp_destroy_page = agp_generic_destroy_page,
.agp_destroy_pages = agp_generic_destroy_pages, .agp_destroy_pages = agp_generic_destroy_pages,
}; };
#endif
static const struct intel_gtt_driver i81x_gtt_driver = { static const struct intel_gtt_driver i81x_gtt_driver = {
.gen = 1, .gen = 1,
...@@ -1376,11 +1392,13 @@ int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev, ...@@ -1376,11 +1392,13 @@ int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev,
intel_private.refcount++; intel_private.refcount++;
#if IS_ENABLED(CONFIG_AGP_INTEL)
if (bridge) { if (bridge) {
bridge->driver = &intel_fake_agp_driver; bridge->driver = &intel_fake_agp_driver;
bridge->dev_private_data = &intel_private; bridge->dev_private_data = &intel_private;
bridge->dev = bridge_pdev; bridge->dev = bridge_pdev;
} }
#endif
intel_private.bridge_dev = pci_dev_get(bridge_pdev); intel_private.bridge_dev = pci_dev_get(bridge_pdev);
......
config DRM_I915 config DRM_I915
tristate "Intel 8xx/9xx/G3x/G4x/HD Graphics" tristate "Intel 8xx/9xx/G3x/G4x/HD Graphics"
depends on DRM depends on DRM
depends on AGP depends on X86 && PCI
depends on AGP_INTEL depends on (AGP || AGP=n)
select INTEL_GTT
select AGP_INTEL if AGP
# we need shmfs for the swappable backing store, and in particular # we need shmfs for the swappable backing store, and in particular
# the shmem_readpage() which depends upon tmpfs # the shmem_readpage() which depends upon tmpfs
select SHMEM select SHMEM
......
...@@ -155,7 +155,11 @@ MODULE_PARM_DESC(prefault_disable, ...@@ -155,7 +155,11 @@ MODULE_PARM_DESC(prefault_disable,
"Disable page prefaulting for pread/pwrite/reloc (default:false). For developers only."); "Disable page prefaulting for pread/pwrite/reloc (default:false). For developers only.");
static struct drm_driver driver; static struct drm_driver driver;
#if IS_ENABLED(CONFIG_AGP_INTEL)
extern int intel_agp_enabled; extern int intel_agp_enabled;
#else
static int intel_agp_enabled;
#endif
static const struct intel_device_info intel_i830_info = { static const struct intel_device_info intel_i830_info = {
.gen = 2, .is_mobile = 1, .cursor_needs_physical = 1, .num_pipes = 2, .gen = 2, .is_mobile = 1, .cursor_needs_physical = 1, .num_pipes = 2,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment