2011-11-03 18:22:04 +00:00
/**************************************************************************
* Copyright ( c ) 2007 - 2011 , Intel Corporation .
* All Rights Reserved .
* Copyright ( c ) 2008 , Tungsten Graphics , Inc . Cedar Park , TX . , USA .
* All Rights Reserved .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms and conditions of the GNU General Public License ,
* version 2 , as published by the Free Software Foundation .
*
* This program is distributed in the hope it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License for
* more details .
*
* You should have received a copy of the GNU General Public License along with
* this program ; if not , write to the Free Software Foundation , Inc . ,
* 51 Franklin St - Fifth Floor , Boston , MA 02110 - 1301 USA .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <drm/drmP.h>
# include <drm/drm.h>
# include "psb_drv.h"
# include "framebuffer.h"
# include "psb_reg.h"
# include "psb_intel_reg.h"
# include "intel_bios.h"
# include "mid_bios.h"
# include <drm/drm_pciids.h>
# include "power.h"
# include <linux/cpu.h>
# include <linux/notifier.h>
# include <linux/spinlock.h>
# include <linux/pm_runtime.h>
# include <acpi/video.h>
2011-11-16 12:13:30 +00:00
# include <linux/module.h>
2017-05-08 15:58:17 -07:00
# include <asm/set_memory.h>
2011-11-03 18:22:04 +00:00
2014-03-15 22:12:17 +01:00
static struct drm_driver driver ;
static int psb_pci_probe ( struct pci_dev * pdev , const struct pci_device_id * ent ) ;
2011-11-03 18:22:04 +00:00
2014-03-15 22:12:18 +01:00
/*
* The table below contains a mapping of the PCI vendor ID and the PCI Device ID
* to the different groups of PowerVR 5 - series chip designs
*
* 0x8086 = Intel Corporation
*
* PowerVR SGX535 - Poulsbo - Intel GMA 500 , Intel Atom Z5xx
* PowerVR SGX535 - Moorestown - Intel GMA 600
* PowerVR SGX535 - Oaktrail - Intel GMA 600 , Intel Atom Z6xx , E6xx
* PowerVR SGX540 - Medfield - Intel Atom Z2460
* PowerVR SGX544MP2 - Medfield -
* PowerVR SGX545 - Cedartrail - Intel GMA 3600 , Intel Atom D2500 , N2600
* PowerVR SGX545 - Cedartrail - Intel GMA 3650 , Intel Atom D2550 , D2700 ,
* N2800
*/
2014-08-08 15:56:03 +02:00
static const struct pci_device_id pciidlist [ ] = {
2011-11-03 18:22:04 +00:00
{ 0x8086 , 0x8108 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & psb_chip_ops } ,
{ 0x8086 , 0x8109 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & psb_chip_ops } ,
2011-12-19 21:06:35 +00:00
# if defined(CONFIG_DRM_GMA600)
2014-03-15 22:12:17 +01:00
{ 0x8086 , 0x4100 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & oaktrail_chip_ops } ,
{ 0x8086 , 0x4101 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & oaktrail_chip_ops } ,
{ 0x8086 , 0x4102 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & oaktrail_chip_ops } ,
{ 0x8086 , 0x4103 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & oaktrail_chip_ops } ,
{ 0x8086 , 0x4104 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & oaktrail_chip_ops } ,
{ 0x8086 , 0x4105 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & oaktrail_chip_ops } ,
{ 0x8086 , 0x4106 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & oaktrail_chip_ops } ,
{ 0x8086 , 0x4107 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & oaktrail_chip_ops } ,
{ 0x8086 , 0x4108 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & oaktrail_chip_ops } ,
2011-11-03 18:22:04 +00:00
# endif
2012-03-08 16:02:20 +00:00
# if defined(CONFIG_DRM_MEDFIELD)
2014-03-15 22:12:17 +01:00
{ 0x8086 , 0x0130 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & mdfld_chip_ops } ,
{ 0x8086 , 0x0131 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & mdfld_chip_ops } ,
{ 0x8086 , 0x0132 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & mdfld_chip_ops } ,
{ 0x8086 , 0x0133 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & mdfld_chip_ops } ,
{ 0x8086 , 0x0134 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & mdfld_chip_ops } ,
{ 0x8086 , 0x0135 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & mdfld_chip_ops } ,
{ 0x8086 , 0x0136 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & mdfld_chip_ops } ,
{ 0x8086 , 0x0137 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & mdfld_chip_ops } ,
2012-03-08 16:02:20 +00:00
# endif
2011-12-29 14:37:03 +00:00
# if defined(CONFIG_DRM_GMA3600)
2014-03-15 22:12:17 +01:00
{ 0x8086 , 0x0be0 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & cdv_chip_ops } ,
{ 0x8086 , 0x0be1 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & cdv_chip_ops } ,
{ 0x8086 , 0x0be2 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & cdv_chip_ops } ,
{ 0x8086 , 0x0be3 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & cdv_chip_ops } ,
{ 0x8086 , 0x0be4 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & cdv_chip_ops } ,
{ 0x8086 , 0x0be5 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & cdv_chip_ops } ,
{ 0x8086 , 0x0be6 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & cdv_chip_ops } ,
{ 0x8086 , 0x0be7 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & cdv_chip_ops } ,
{ 0x8086 , 0x0be8 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & cdv_chip_ops } ,
{ 0x8086 , 0x0be9 , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & cdv_chip_ops } ,
{ 0x8086 , 0x0bea , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & cdv_chip_ops } ,
{ 0x8086 , 0x0beb , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & cdv_chip_ops } ,
{ 0x8086 , 0x0bec , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & cdv_chip_ops } ,
{ 0x8086 , 0x0bed , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & cdv_chip_ops } ,
{ 0x8086 , 0x0bee , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & cdv_chip_ops } ,
{ 0x8086 , 0x0bef , PCI_ANY_ID , PCI_ANY_ID , 0 , 0 , ( long ) & cdv_chip_ops } ,
2011-11-03 18:22:04 +00:00
# endif
2012-03-08 16:09:19 +00:00
{ 0 , }
2011-11-03 18:22:04 +00:00
} ;
MODULE_DEVICE_TABLE ( pci , pciidlist ) ;
/*
* Standard IOCTLs .
*/
2013-08-02 13:27:49 -04:00
static const struct drm_ioctl_desc psb_ioctls [ ] = {
2011-11-03 18:22:04 +00:00
} ;
static int psb_do_init ( struct drm_device * dev )
{
struct drm_psb_private * dev_priv = dev - > dev_private ;
struct psb_gtt * pg = & dev_priv - > gtt ;
uint32_t stolen_gtt ;
if ( pg - > mmu_gatt_start & 0x0FFFFFFF ) {
dev_err ( dev - > dev , " Gatt must be 256M aligned. This is a bug. \n " ) ;
2014-03-15 22:12:16 +01:00
return - EINVAL ;
2011-11-03 18:22:04 +00:00
}
stolen_gtt = ( pg - > stolen_size > > PAGE_SHIFT ) * 4 ;
stolen_gtt = ( stolen_gtt + PAGE_SIZE - 1 ) > > PAGE_SHIFT ;
2014-03-15 22:12:17 +01:00
stolen_gtt = ( stolen_gtt < pg - > gtt_pages ) ? stolen_gtt : pg - > gtt_pages ;
2011-11-03 18:22:04 +00:00
dev_priv - > gatt_free_offset = pg - > mmu_gatt_start +
( stolen_gtt < < PAGE_SHIFT ) * 1024 ;
spin_lock_init ( & dev_priv - > irqmask_lock ) ;
2011-11-29 22:27:10 +00:00
spin_lock_init ( & dev_priv - > lock_2d ) ;
2011-11-03 18:22:04 +00:00
PSB_WSGX32 ( 0x00000000 , PSB_CR_BIF_BANK0 ) ;
PSB_WSGX32 ( 0x00000000 , PSB_CR_BIF_BANK1 ) ;
PSB_RSGX32 ( PSB_CR_BIF_BANK1 ) ;
2014-01-04 22:11:17 +01:00
/* Do not bypass any MMU access, let them pagefault instead */
PSB_WSGX32 ( ( PSB_RSGX32 ( PSB_CR_BIF_CTRL ) & ~ _PSB_MMU_ER_MASK ) ,
PSB_CR_BIF_CTRL ) ;
PSB_RSGX32 ( PSB_CR_BIF_CTRL ) ;
2011-11-03 18:22:04 +00:00
psb_spank ( dev_priv ) ;
/* mmu_gatt ?? */
PSB_WSGX32 ( pg - > gatt_start , PSB_CR_BIF_TWOD_REQ_BASE ) ;
2014-01-04 22:11:17 +01:00
PSB_RSGX32 ( PSB_CR_BIF_TWOD_REQ_BASE ) ; /* Post */
2011-11-03 18:22:04 +00:00
return 0 ;
}
2017-01-06 15:57:31 -02:00
static void psb_driver_unload ( struct drm_device * dev )
2011-11-03 18:22:04 +00:00
{
struct drm_psb_private * dev_priv = dev - > dev_private ;
2014-03-15 22:12:18 +01:00
/* TODO: Kill vblank etc here */
2011-11-03 18:22:04 +00:00
if ( dev_priv ) {
2012-05-14 12:04:00 +01:00
if ( dev_priv - > backlight_device )
gma_backlight_exit ( dev ) ;
psb_modeset_cleanup ( dev ) ;
2011-11-03 18:22:04 +00:00
if ( dev_priv - > ops - > chip_teardown )
dev_priv - > ops - > chip_teardown ( dev ) ;
2012-05-14 12:03:34 +01:00
psb_intel_opregion_fini ( dev ) ;
2011-11-03 18:22:04 +00:00
if ( dev_priv - > pf_pd ) {
psb_mmu_free_pagedir ( dev_priv - > pf_pd ) ;
dev_priv - > pf_pd = NULL ;
}
if ( dev_priv - > mmu ) {
struct psb_gtt * pg = & dev_priv - > gtt ;
down_read ( & pg - > sem ) ;
psb_mmu_remove_pfn_sequence (
psb_mmu_get_default_pd
( dev_priv - > mmu ) ,
pg - > mmu_gatt_start ,
dev_priv - > vram_stolen_size > > PAGE_SHIFT ) ;
up_read ( & pg - > sem ) ;
psb_mmu_driver_takedown ( dev_priv - > mmu ) ;
dev_priv - > mmu = NULL ;
}
psb_gtt_takedown ( dev ) ;
if ( dev_priv - > scratch_page ) {
2012-04-25 14:36:13 +01:00
set_pages_wb ( dev_priv - > scratch_page , 1 ) ;
2011-11-03 18:22:04 +00:00
__free_page ( dev_priv - > scratch_page ) ;
dev_priv - > scratch_page = NULL ;
}
if ( dev_priv - > vdc_reg ) {
iounmap ( dev_priv - > vdc_reg ) ;
dev_priv - > vdc_reg = NULL ;
}
if ( dev_priv - > sgx_reg ) {
iounmap ( dev_priv - > sgx_reg ) ;
dev_priv - > sgx_reg = NULL ;
}
2013-09-16 18:02:40 +02:00
if ( dev_priv - > aux_reg ) {
iounmap ( dev_priv - > aux_reg ) ;
dev_priv - > aux_reg = NULL ;
}
2016-07-22 10:30:30 +02:00
pci_dev_put ( dev_priv - > aux_pdev ) ;
pci_dev_put ( dev_priv - > lpc_pdev ) ;
2011-11-03 18:22:04 +00:00
2012-05-14 12:04:00 +01:00
/* Destroy VBT data */
psb_intel_destroy_bios ( dev ) ;
2011-11-03 18:22:04 +00:00
kfree ( dev_priv ) ;
dev - > dev_private = NULL ;
}
gma_power_uninit ( dev ) ;
}
2014-03-15 22:12:17 +01:00
static int psb_driver_load ( struct drm_device * dev , unsigned long flags )
2011-11-03 18:22:04 +00:00
{
struct drm_psb_private * dev_priv ;
2013-09-16 18:02:40 +02:00
unsigned long resource_start , resource_len ;
2011-11-03 18:22:04 +00:00
unsigned long irqflags ;
int ret = - ENOMEM ;
struct drm_connector * connector ;
2013-07-22 17:45:26 +02:00
struct gma_encoder * gma_encoder ;
2014-01-04 22:11:17 +01:00
struct psb_gtt * pg ;
2011-11-03 18:22:04 +00:00
2014-03-15 22:12:18 +01:00
/* allocating and initializing driver private data */
2011-11-03 18:22:04 +00:00
dev_priv = kzalloc ( sizeof ( * dev_priv ) , GFP_KERNEL ) ;
if ( dev_priv = = NULL )
return - ENOMEM ;
2014-03-15 22:12:17 +01:00
dev_priv - > ops = ( struct psb_ops * ) flags ;
2011-11-03 18:22:04 +00:00
dev_priv - > dev = dev ;
dev - > dev_private = ( void * ) dev_priv ;
2014-01-04 22:11:17 +01:00
pg = & dev_priv - > gtt ;
2011-12-19 11:15:29 +00:00
pci_set_master ( dev - > pdev ) ;
2011-11-03 18:22:04 +00:00
dev_priv - > num_pipe = dev_priv - > ops - > pipes ;
resource_start = pci_resource_start ( dev - > pdev , PSB_MMIO_RESOURCE ) ;
dev_priv - > vdc_reg =
ioremap ( resource_start + PSB_VDC_OFFSET , PSB_VDC_SIZE ) ;
if ( ! dev_priv - > vdc_reg )
goto out_err ;
dev_priv - > sgx_reg = ioremap ( resource_start + dev_priv - > ops - > sgx_offset ,
PSB_SGX_SIZE ) ;
if ( ! dev_priv - > sgx_reg )
goto out_err ;
2013-09-16 18:02:40 +02:00
if ( IS_MRST ( dev ) ) {
2017-12-19 00:37:44 -05:00
int domain = pci_domain_nr ( dev - > pdev - > bus ) ;
dev_priv - > aux_pdev =
pci_get_domain_bus_and_slot ( domain , 0 ,
PCI_DEVFN ( 3 , 0 ) ) ;
2013-09-16 18:02:40 +02:00
if ( dev_priv - > aux_pdev ) {
resource_start = pci_resource_start ( dev_priv - > aux_pdev ,
PSB_AUX_RESOURCE ) ;
resource_len = pci_resource_len ( dev_priv - > aux_pdev ,
PSB_AUX_RESOURCE ) ;
dev_priv - > aux_reg = ioremap_nocache ( resource_start ,
resource_len ) ;
if ( ! dev_priv - > aux_reg )
goto out_err ;
DRM_DEBUG_KMS ( " Found aux vdc " ) ;
} else {
/* Couldn't find the aux vdc so map to primary vdc */
dev_priv - > aux_reg = dev_priv - > vdc_reg ;
DRM_DEBUG_KMS ( " Couldn't find aux pci device " ) ;
}
dev_priv - > gmbus_reg = dev_priv - > aux_reg ;
2014-09-26 10:40:29 +02:00
2017-12-19 00:37:44 -05:00
dev_priv - > lpc_pdev =
pci_get_domain_bus_and_slot ( domain , 0 ,
PCI_DEVFN ( 31 , 0 ) ) ;
2014-09-26 10:40:29 +02:00
if ( dev_priv - > lpc_pdev ) {
pci_read_config_word ( dev_priv - > lpc_pdev , PSB_LPC_GBA ,
& dev_priv - > lpc_gpio_base ) ;
pci_write_config_dword ( dev_priv - > lpc_pdev , PSB_LPC_GBA ,
( u32 ) dev_priv - > lpc_gpio_base | ( 1L < < 31 ) ) ;
pci_read_config_word ( dev_priv - > lpc_pdev , PSB_LPC_GBA ,
& dev_priv - > lpc_gpio_base ) ;
dev_priv - > lpc_gpio_base & = 0xffc0 ;
if ( dev_priv - > lpc_gpio_base )
DRM_DEBUG_KMS ( " Found LPC GPIO at 0x%04x \n " ,
dev_priv - > lpc_gpio_base ) ;
else {
pci_dev_put ( dev_priv - > lpc_pdev ) ;
dev_priv - > lpc_pdev = NULL ;
}
}
2013-09-16 18:02:40 +02:00
} else {
dev_priv - > gmbus_reg = dev_priv - > vdc_reg ;
}
2012-05-03 15:06:18 +01:00
psb_intel_opregion_setup ( dev ) ;
2011-11-03 18:22:04 +00:00
ret = dev_priv - > ops - > chip_setup ( dev ) ;
if ( ret )
goto out_err ;
/* Init OSPM support */
gma_power_init ( dev ) ;
ret = - ENOMEM ;
dev_priv - > scratch_page = alloc_page ( GFP_DMA32 | __GFP_ZERO ) ;
if ( ! dev_priv - > scratch_page )
goto out_err ;
set_pages_uc ( dev_priv - > scratch_page , 1 ) ;
ret = psb_gtt_init ( dev , 0 ) ;
if ( ret )
goto out_err ;
2014-01-05 00:27:51 +01:00
dev_priv - > mmu = psb_mmu_driver_init ( dev , 1 , 0 , 0 ) ;
2011-11-03 18:22:04 +00:00
if ( ! dev_priv - > mmu )
goto out_err ;
dev_priv - > pf_pd = psb_mmu_alloc_pd ( dev_priv - > mmu , 1 , 0 ) ;
if ( ! dev_priv - > pf_pd )
goto out_err ;
ret = psb_do_init ( dev ) ;
if ( ret )
return ret ;
2014-01-04 22:11:17 +01:00
/* Add stolen memory to SGX MMU */
down_read ( & pg - > sem ) ;
ret = psb_mmu_insert_pfn_sequence ( psb_mmu_get_default_pd ( dev_priv - > mmu ) ,
dev_priv - > stolen_base > > PAGE_SHIFT ,
pg - > gatt_start ,
pg - > stolen_size > > PAGE_SHIFT , 0 ) ;
up_read ( & pg - > sem ) ;
psb_mmu_set_pd_context ( psb_mmu_get_default_pd ( dev_priv - > mmu ) , 0 ) ;
psb_mmu_set_pd_context ( dev_priv - > pf_pd , 1 ) ;
2011-11-03 18:22:04 +00:00
PSB_WSGX32 ( 0x20000000 , PSB_CR_PDS_EXEC_BASE ) ;
PSB_WSGX32 ( 0x30000000 , PSB_CR_BIF_3D_REQ_BASE ) ;
2012-05-03 15:06:18 +01:00
acpi_video_register ( ) ;
2011-11-03 18:22:04 +00:00
2014-03-15 22:12:18 +01:00
/* Setup vertical blanking handling */
2011-11-03 18:22:04 +00:00
ret = drm_vblank_init ( dev , dev_priv - > num_pipe ) ;
if ( ret )
goto out_err ;
/*
* Install interrupt handlers prior to powering off SGX or else we will
* crash .
*/
dev_priv - > vdc_irq_mask = 0 ;
dev_priv - > pipestat [ 0 ] = 0 ;
dev_priv - > pipestat [ 1 ] = 0 ;
dev_priv - > pipestat [ 2 ] = 0 ;
spin_lock_irqsave ( & dev_priv - > irqmask_lock , irqflags ) ;
PSB_WVDC32 ( 0xFFFFFFFF , PSB_HWSTAM ) ;
PSB_WVDC32 ( 0x00000000 , PSB_INT_ENABLE_R ) ;
PSB_WVDC32 ( 0xFFFFFFFF , PSB_INT_MASK_R ) ;
spin_unlock_irqrestore ( & dev_priv - > irqmask_lock , irqflags ) ;
2012-05-11 11:33:17 +01:00
2013-11-03 21:09:27 +01:00
drm_irq_install ( dev , dev - > pdev - > irq ) ;
2011-11-03 18:22:04 +00:00
dev - > max_vblank_count = 0xffffff ; /* only 24 bits of frame count */
dev - > driver - > get_vblank_counter = psb_get_vblank_counter ;
2011-12-29 14:38:07 +00:00
psb_modeset_init ( dev ) ;
psb_fbdev_init ( dev ) ;
drm_kms_helper_poll_init ( dev ) ;
2011-11-03 18:22:04 +00:00
/* Only add backlight support if we have LVDS output */
list_for_each_entry ( connector , & dev - > mode_config . connector_list ,
head ) {
2013-07-22 17:45:26 +02:00
gma_encoder = gma_attached_encoder ( connector ) ;
2011-11-03 18:22:04 +00:00
2013-07-22 17:45:26 +02:00
switch ( gma_encoder - > type ) {
2011-11-03 18:22:04 +00:00
case INTEL_OUTPUT_LVDS :
case INTEL_OUTPUT_MIPI :
ret = gma_backlight_init ( dev ) ;
break ;
}
}
if ( ret )
return ret ;
2012-07-16 17:52:45 +01:00
psb_intel_opregion_enable_asle ( dev ) ;
2011-11-03 18:22:04 +00:00
#if 0
2014-03-15 22:12:18 +01:00
/* Enable runtime pm at last */
2011-11-03 18:22:04 +00:00
pm_runtime_enable ( & dev - > pdev - > dev ) ;
pm_runtime_set_active ( & dev - > pdev - > dev ) ;
# endif
2014-03-15 22:12:18 +01:00
/* Intel drm driver load is done, continue doing pvr load */
2011-11-03 18:22:04 +00:00
return 0 ;
out_err :
psb_driver_unload ( dev ) ;
return ret ;
}
static inline void get_brightness ( struct backlight_device * bd )
{
# ifdef CONFIG_BACKLIGHT_CLASS_DEVICE
if ( bd ) {
bd - > props . brightness = bd - > ops - > get_brightness ( bd ) ;
backlight_update_status ( bd ) ;
}
# endif
}
static long psb_unlocked_ioctl ( struct file * filp , unsigned int cmd ,
unsigned long arg )
{
struct drm_file * file_priv = filp - > private_data ;
struct drm_device * dev = file_priv - > minor - > dev ;
struct drm_psb_private * dev_priv = dev - > dev_private ;
static unsigned int runtime_allowed ;
if ( runtime_allowed = = 1 & & dev_priv - > is_lvds_on ) {
runtime_allowed + + ;
pm_runtime_allow ( & dev - > pdev - > dev ) ;
dev_priv - > rpm_enabled = 1 ;
}
return drm_ioctl ( filp , cmd , arg ) ;
/* FIXME: do we need to wrap the other side of this */
}
2014-03-15 22:12:17 +01:00
static int psb_pci_probe ( struct pci_dev * pdev , const struct pci_device_id * ent )
{
return drm_get_pci_dev ( pdev , ent , & driver ) ;
}
static void psb_pci_remove ( struct pci_dev * pdev )
2011-11-03 18:22:04 +00:00
{
struct drm_device * dev = pci_get_drvdata ( pdev ) ;
drm_put_dev ( dev ) ;
}
static const struct dev_pm_ops psb_pm_ops = {
. resume = gma_power_resume ,
. suspend = gma_power_suspend ,
2013-04-06 00:45:22 +02:00
. thaw = gma_power_thaw ,
. freeze = gma_power_freeze ,
. restore = gma_power_restore ,
2011-11-03 18:22:04 +00:00
. runtime_suspend = psb_runtime_suspend ,
. runtime_resume = psb_runtime_resume ,
. runtime_idle = psb_runtime_idle ,
} ;
2012-05-17 13:27:22 +02:00
static const struct vm_operations_struct psb_gem_vm_ops = {
2011-11-03 18:22:04 +00:00
. fault = psb_gem_fault ,
. open = drm_gem_vm_open ,
. close = drm_gem_vm_close ,
} ;
2011-11-27 11:08:33 -05:00
static const struct file_operations psb_gem_fops = {
. owner = THIS_MODULE ,
. open = drm_open ,
. release = drm_release ,
. unlocked_ioctl = psb_unlocked_ioctl ,
2016-11-01 15:43:15 +01:00
. compat_ioctl = drm_compat_ioctl ,
2011-11-27 11:08:33 -05:00
. mmap = drm_gem_mmap ,
. poll = drm_poll ,
. read = drm_read ,
} ;
2011-11-03 18:22:04 +00:00
static struct drm_driver driver = {
. driver_features = DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | \
2014-03-15 22:12:17 +01:00
DRIVER_MODESET | DRIVER_GEM ,
2011-11-03 18:22:04 +00:00
. load = psb_driver_load ,
. unload = psb_driver_unload ,
2017-12-05 19:24:58 +01:00
. lastclose = drm_fb_helper_lastclose ,
2011-11-03 18:22:04 +00:00
2014-06-09 14:39:49 +01:00
. num_ioctls = ARRAY_SIZE ( psb_ioctls ) ,
2011-11-03 18:22:04 +00:00
. irq_preinstall = psb_irq_preinstall ,
. irq_postinstall = psb_irq_postinstall ,
. irq_uninstall = psb_irq_uninstall ,
. irq_handler = psb_irq_handler ,
. enable_vblank = psb_enable_vblank ,
. disable_vblank = psb_disable_vblank ,
. get_vblank_counter = psb_get_vblank_counter ,
. gem_free_object = psb_gem_free_object ,
. gem_vm_ops = & psb_gem_vm_ops ,
2014-03-15 22:12:17 +01:00
2011-11-03 18:22:04 +00:00
. dumb_create = psb_gem_dumb_create ,
2014-03-15 22:12:17 +01:00
. ioctls = psb_ioctls ,
2011-11-27 11:08:33 -05:00
. fops = & psb_gem_fops ,
2011-11-03 18:22:04 +00:00
. name = DRIVER_NAME ,
. desc = DRIVER_DESC ,
2014-03-15 22:12:17 +01:00
. date = DRIVER_DATE ,
. major = DRIVER_MAJOR ,
. minor = DRIVER_MINOR ,
. patchlevel = DRIVER_PATCHLEVEL
2011-11-03 18:22:04 +00:00
} ;
static struct pci_driver psb_pci_driver = {
. name = DRIVER_NAME ,
. id_table = pciidlist ,
2014-03-15 22:12:17 +01:00
. probe = psb_pci_probe ,
. remove = psb_pci_remove ,
. driver . pm = & psb_pm_ops ,
2011-11-03 18:22:04 +00:00
} ;
static int __init psb_init ( void )
{
2017-05-24 16:51:40 +02:00
return pci_register_driver ( & psb_pci_driver ) ;
2011-11-03 18:22:04 +00:00
}
static void __exit psb_exit ( void )
{
2017-05-24 16:51:40 +02:00
pci_unregister_driver ( & psb_pci_driver ) ;
2011-11-03 18:22:04 +00:00
}
late_initcall ( psb_init ) ;
module_exit ( psb_exit ) ;
2014-03-15 22:12:17 +01:00
MODULE_AUTHOR ( DRIVER_AUTHOR ) ;
2011-11-03 18:22:04 +00:00
MODULE_DESCRIPTION ( DRIVER_DESC ) ;
2017-11-17 15:16:32 +01:00
MODULE_LICENSE ( " GPL " ) ;