psb_drv.c 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211
  1. /**************************************************************************
  2. * Copyright (c) 2007-2011, Intel Corporation.
  3. * All Rights Reserved.
  4. * Copyright (c) 2008, Tungsten Graphics, Inc. Cedar Park, TX., USA.
  5. * All Rights Reserved.
  6. *
  7. * This program is free software; you can redistribute it and/or modify it
  8. * under the terms and conditions of the GNU General Public License,
  9. * version 2, as published by the Free Software Foundation.
  10. *
  11. * This program is distributed in the hope it will be useful, but WITHOUT
  12. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  14. * more details.
  15. *
  16. * You should have received a copy of the GNU General Public License along with
  17. * this program; if not, write to the Free Software Foundation, Inc.,
  18. * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
  19. *
  20. **************************************************************************/
  21. #include <drm/drmP.h>
  22. #include <drm/drm.h>
  23. #include "psb_drm.h"
  24. #include "psb_drv.h"
  25. #include "framebuffer.h"
  26. #include "psb_reg.h"
  27. #include "psb_intel_reg.h"
  28. #include "intel_bios.h"
  29. #include "mid_bios.h"
  30. #include <drm/drm_pciids.h>
  31. #include "power.h"
  32. #include <linux/cpu.h>
  33. #include <linux/notifier.h>
  34. #include <linux/spinlock.h>
  35. #include <linux/pm_runtime.h>
  36. #include <acpi/video.h>
  37. #include <linux/module.h>
  38. static int drm_psb_trap_pagefaults;
  39. int drm_psb_no_fb;
  40. static int psb_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
  41. MODULE_PARM_DESC(no_fb, "Disable FBdev");
  42. MODULE_PARM_DESC(trap_pagefaults, "Error and reset on MMU pagefaults");
  43. module_param_named(no_fb, drm_psb_no_fb, int, 0600);
  44. module_param_named(trap_pagefaults, drm_psb_trap_pagefaults, int, 0600);
  45. static DEFINE_PCI_DEVICE_TABLE(pciidlist) = {
  46. { 0x8086, 0x8108, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &psb_chip_ops },
  47. { 0x8086, 0x8109, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &psb_chip_ops },
  48. #if defined(CONFIG_DRM_OAKTRAIL)
  49. { 0x8086, 0x4100, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &oaktrail_chip_ops},
  50. { 0x8086, 0x4101, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &oaktrail_chip_ops},
  51. { 0x8086, 0x4102, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &oaktrail_chip_ops},
  52. { 0x8086, 0x4103, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &oaktrail_chip_ops},
  53. { 0x8086, 0x4104, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &oaktrail_chip_ops},
  54. { 0x8086, 0x4105, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &oaktrail_chip_ops},
  55. { 0x8086, 0x4106, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &oaktrail_chip_ops},
  56. { 0x8086, 0x4107, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &oaktrail_chip_ops},
  57. #endif
  58. #if defined(CONFIG_DRM_CDV)
  59. { 0x8086, 0x0be0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &cdv_chip_ops},
  60. { 0x8086, 0x0be1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &cdv_chip_ops},
  61. { 0x8086, 0x0be2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &cdv_chip_ops},
  62. { 0x8086, 0x0be3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &cdv_chip_ops},
  63. { 0x8086, 0x0be4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &cdv_chip_ops},
  64. { 0x8086, 0x0be5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &cdv_chip_ops},
  65. { 0x8086, 0x0be6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &cdv_chip_ops},
  66. { 0x8086, 0x0be7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, (long) &cdv_chip_ops},
  67. #endif
  68. { 0, 0, 0}
  69. };
  70. MODULE_DEVICE_TABLE(pci, pciidlist);
  71. /*
  72. * Standard IOCTLs.
  73. */
  74. #define DRM_IOCTL_PSB_SIZES \
  75. DRM_IOR(DRM_PSB_SIZES + DRM_COMMAND_BASE, \
  76. struct drm_psb_sizes_arg)
  77. #define DRM_IOCTL_PSB_FUSE_REG \
  78. DRM_IOWR(DRM_PSB_FUSE_REG + DRM_COMMAND_BASE, uint32_t)
  79. #define DRM_IOCTL_PSB_DC_STATE \
  80. DRM_IOW(DRM_PSB_DC_STATE + DRM_COMMAND_BASE, \
  81. struct drm_psb_dc_state_arg)
  82. #define DRM_IOCTL_PSB_ADB \
  83. DRM_IOWR(DRM_PSB_ADB + DRM_COMMAND_BASE, uint32_t)
  84. #define DRM_IOCTL_PSB_MODE_OPERATION \
  85. DRM_IOWR(DRM_PSB_MODE_OPERATION + DRM_COMMAND_BASE, \
  86. struct drm_psb_mode_operation_arg)
  87. #define DRM_IOCTL_PSB_STOLEN_MEMORY \
  88. DRM_IOWR(DRM_PSB_STOLEN_MEMORY + DRM_COMMAND_BASE, \
  89. struct drm_psb_stolen_memory_arg)
  90. #define DRM_IOCTL_PSB_REGISTER_RW \
  91. DRM_IOWR(DRM_PSB_REGISTER_RW + DRM_COMMAND_BASE, \
  92. struct drm_psb_register_rw_arg)
  93. #define DRM_IOCTL_PSB_DPST \
  94. DRM_IOWR(DRM_PSB_DPST + DRM_COMMAND_BASE, \
  95. uint32_t)
  96. #define DRM_IOCTL_PSB_GAMMA \
  97. DRM_IOWR(DRM_PSB_GAMMA + DRM_COMMAND_BASE, \
  98. struct drm_psb_dpst_lut_arg)
  99. #define DRM_IOCTL_PSB_DPST_BL \
  100. DRM_IOWR(DRM_PSB_DPST_BL + DRM_COMMAND_BASE, \
  101. uint32_t)
  102. #define DRM_IOCTL_PSB_GET_PIPE_FROM_CRTC_ID \
  103. DRM_IOWR(DRM_PSB_GET_PIPE_FROM_CRTC_ID + DRM_COMMAND_BASE, \
  104. struct drm_psb_get_pipe_from_crtc_id_arg)
  105. #define DRM_IOCTL_PSB_GEM_CREATE \
  106. DRM_IOWR(DRM_PSB_GEM_CREATE + DRM_COMMAND_BASE, \
  107. struct drm_psb_gem_create)
  108. #define DRM_IOCTL_PSB_GEM_MMAP \
  109. DRM_IOWR(DRM_PSB_GEM_MMAP + DRM_COMMAND_BASE, \
  110. struct drm_psb_gem_mmap)
  111. static int psb_sizes_ioctl(struct drm_device *dev, void *data,
  112. struct drm_file *file_priv);
  113. static int psb_dc_state_ioctl(struct drm_device *dev, void * data,
  114. struct drm_file *file_priv);
  115. static int psb_adb_ioctl(struct drm_device *dev, void *data,
  116. struct drm_file *file_priv);
  117. static int psb_mode_operation_ioctl(struct drm_device *dev, void *data,
  118. struct drm_file *file_priv);
  119. static int psb_stolen_memory_ioctl(struct drm_device *dev, void *data,
  120. struct drm_file *file_priv);
  121. static int psb_register_rw_ioctl(struct drm_device *dev, void *data,
  122. struct drm_file *file_priv);
  123. static int psb_dpst_ioctl(struct drm_device *dev, void *data,
  124. struct drm_file *file_priv);
  125. static int psb_gamma_ioctl(struct drm_device *dev, void *data,
  126. struct drm_file *file_priv);
  127. static int psb_dpst_bl_ioctl(struct drm_device *dev, void *data,
  128. struct drm_file *file_priv);
  129. #define PSB_IOCTL_DEF(ioctl, func, flags) \
  130. [DRM_IOCTL_NR(ioctl) - DRM_COMMAND_BASE] = {ioctl, flags, func}
  131. static struct drm_ioctl_desc psb_ioctls[] = {
  132. PSB_IOCTL_DEF(DRM_IOCTL_PSB_SIZES, psb_sizes_ioctl, DRM_AUTH),
  133. PSB_IOCTL_DEF(DRM_IOCTL_PSB_DC_STATE, psb_dc_state_ioctl, DRM_AUTH),
  134. PSB_IOCTL_DEF(DRM_IOCTL_PSB_ADB, psb_adb_ioctl, DRM_AUTH),
  135. PSB_IOCTL_DEF(DRM_IOCTL_PSB_MODE_OPERATION, psb_mode_operation_ioctl,
  136. DRM_AUTH),
  137. PSB_IOCTL_DEF(DRM_IOCTL_PSB_STOLEN_MEMORY, psb_stolen_memory_ioctl,
  138. DRM_AUTH),
  139. PSB_IOCTL_DEF(DRM_IOCTL_PSB_REGISTER_RW, psb_register_rw_ioctl,
  140. DRM_AUTH),
  141. PSB_IOCTL_DEF(DRM_IOCTL_PSB_DPST, psb_dpst_ioctl, DRM_AUTH),
  142. PSB_IOCTL_DEF(DRM_IOCTL_PSB_GAMMA, psb_gamma_ioctl, DRM_AUTH),
  143. PSB_IOCTL_DEF(DRM_IOCTL_PSB_DPST_BL, psb_dpst_bl_ioctl, DRM_AUTH),
  144. PSB_IOCTL_DEF(DRM_IOCTL_PSB_GET_PIPE_FROM_CRTC_ID,
  145. psb_intel_get_pipe_from_crtc_id, 0),
  146. PSB_IOCTL_DEF(DRM_IOCTL_PSB_GEM_CREATE, psb_gem_create_ioctl,
  147. DRM_UNLOCKED | DRM_AUTH),
  148. PSB_IOCTL_DEF(DRM_IOCTL_PSB_GEM_MMAP, psb_gem_mmap_ioctl,
  149. DRM_UNLOCKED | DRM_AUTH),
  150. };
  151. static void psb_lastclose(struct drm_device *dev)
  152. {
  153. return;
  154. }
  155. static void psb_do_takedown(struct drm_device *dev)
  156. {
  157. /* FIXME: do we need to clean up the gtt here ? */
  158. }
  159. static int psb_do_init(struct drm_device *dev)
  160. {
  161. struct drm_psb_private *dev_priv = dev->dev_private;
  162. struct psb_gtt *pg = &dev_priv->gtt;
  163. uint32_t stolen_gtt;
  164. int ret = -ENOMEM;
  165. if (pg->mmu_gatt_start & 0x0FFFFFFF) {
  166. dev_err(dev->dev, "Gatt must be 256M aligned. This is a bug.\n");
  167. ret = -EINVAL;
  168. goto out_err;
  169. }
  170. stolen_gtt = (pg->stolen_size >> PAGE_SHIFT) * 4;
  171. stolen_gtt = (stolen_gtt + PAGE_SIZE - 1) >> PAGE_SHIFT;
  172. stolen_gtt =
  173. (stolen_gtt < pg->gtt_pages) ? stolen_gtt : pg->gtt_pages;
  174. dev_priv->gatt_free_offset = pg->mmu_gatt_start +
  175. (stolen_gtt << PAGE_SHIFT) * 1024;
  176. if (1 || drm_debug) {
  177. uint32_t core_id = PSB_RSGX32(PSB_CR_CORE_ID);
  178. uint32_t core_rev = PSB_RSGX32(PSB_CR_CORE_REVISION);
  179. DRM_INFO("SGX core id = 0x%08x\n", core_id);
  180. DRM_INFO("SGX core rev major = 0x%02x, minor = 0x%02x\n",
  181. (core_rev & _PSB_CC_REVISION_MAJOR_MASK) >>
  182. _PSB_CC_REVISION_MAJOR_SHIFT,
  183. (core_rev & _PSB_CC_REVISION_MINOR_MASK) >>
  184. _PSB_CC_REVISION_MINOR_SHIFT);
  185. DRM_INFO
  186. ("SGX core rev maintenance = 0x%02x, designer = 0x%02x\n",
  187. (core_rev & _PSB_CC_REVISION_MAINTENANCE_MASK) >>
  188. _PSB_CC_REVISION_MAINTENANCE_SHIFT,
  189. (core_rev & _PSB_CC_REVISION_DESIGNER_MASK) >>
  190. _PSB_CC_REVISION_DESIGNER_SHIFT);
  191. }
  192. spin_lock_init(&dev_priv->irqmask_lock);
  193. mutex_init(&dev_priv->mutex_2d);
  194. PSB_WSGX32(0x00000000, PSB_CR_BIF_BANK0);
  195. PSB_WSGX32(0x00000000, PSB_CR_BIF_BANK1);
  196. PSB_RSGX32(PSB_CR_BIF_BANK1);
  197. PSB_WSGX32(PSB_RSGX32(PSB_CR_BIF_CTRL) | _PSB_MMU_ER_MASK,
  198. PSB_CR_BIF_CTRL);
  199. psb_spank(dev_priv);
  200. /* mmu_gatt ?? */
  201. PSB_WSGX32(pg->gatt_start, PSB_CR_BIF_TWOD_REQ_BASE);
  202. return 0;
  203. out_err:
  204. psb_do_takedown(dev);
  205. return ret;
  206. }
  207. static int psb_driver_unload(struct drm_device *dev)
  208. {
  209. struct drm_psb_private *dev_priv = dev->dev_private;
  210. /* Kill vblank etc here */
  211. gma_backlight_exit(dev);
  212. if (drm_psb_no_fb == 0)
  213. psb_modeset_cleanup(dev);
  214. if (dev_priv) {
  215. psb_lid_timer_takedown(dev_priv);
  216. gma_intel_opregion_exit(dev);
  217. if (dev_priv->ops->chip_teardown)
  218. dev_priv->ops->chip_teardown(dev);
  219. psb_do_takedown(dev);
  220. if (dev_priv->pf_pd) {
  221. psb_mmu_free_pagedir(dev_priv->pf_pd);
  222. dev_priv->pf_pd = NULL;
  223. }
  224. if (dev_priv->mmu) {
  225. struct psb_gtt *pg = &dev_priv->gtt;
  226. down_read(&pg->sem);
  227. psb_mmu_remove_pfn_sequence(
  228. psb_mmu_get_default_pd
  229. (dev_priv->mmu),
  230. pg->mmu_gatt_start,
  231. dev_priv->vram_stolen_size >> PAGE_SHIFT);
  232. up_read(&pg->sem);
  233. psb_mmu_driver_takedown(dev_priv->mmu);
  234. dev_priv->mmu = NULL;
  235. }
  236. psb_gtt_takedown(dev);
  237. if (dev_priv->scratch_page) {
  238. __free_page(dev_priv->scratch_page);
  239. dev_priv->scratch_page = NULL;
  240. }
  241. if (dev_priv->vdc_reg) {
  242. iounmap(dev_priv->vdc_reg);
  243. dev_priv->vdc_reg = NULL;
  244. }
  245. if (dev_priv->sgx_reg) {
  246. iounmap(dev_priv->sgx_reg);
  247. dev_priv->sgx_reg = NULL;
  248. }
  249. kfree(dev_priv);
  250. dev->dev_private = NULL;
  251. /*destroy VBT data*/
  252. psb_intel_destroy_bios(dev);
  253. }
  254. gma_power_uninit(dev);
  255. return 0;
  256. }
  257. static int psb_driver_load(struct drm_device *dev, unsigned long chipset)
  258. {
  259. struct drm_psb_private *dev_priv;
  260. unsigned long resource_start;
  261. struct psb_gtt *pg;
  262. unsigned long irqflags;
  263. int ret = -ENOMEM;
  264. uint32_t tt_pages;
  265. struct drm_connector *connector;
  266. struct psb_intel_output *psb_intel_output;
  267. dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL);
  268. if (dev_priv == NULL)
  269. return -ENOMEM;
  270. dev_priv->ops = (struct psb_ops *)chipset;
  271. dev_priv->dev = dev;
  272. dev->dev_private = (void *) dev_priv;
  273. dev_priv->num_pipe = dev_priv->ops->pipes;
  274. resource_start = pci_resource_start(dev->pdev, PSB_MMIO_RESOURCE);
  275. dev_priv->vdc_reg =
  276. ioremap(resource_start + PSB_VDC_OFFSET, PSB_VDC_SIZE);
  277. if (!dev_priv->vdc_reg)
  278. goto out_err;
  279. dev_priv->sgx_reg = ioremap(resource_start + dev_priv->ops->sgx_offset,
  280. PSB_SGX_SIZE);
  281. if (!dev_priv->sgx_reg)
  282. goto out_err;
  283. ret = dev_priv->ops->chip_setup(dev);
  284. if (ret)
  285. goto out_err;
  286. /* Init OSPM support */
  287. gma_power_init(dev);
  288. ret = -ENOMEM;
  289. dev_priv->scratch_page = alloc_page(GFP_DMA32 | __GFP_ZERO);
  290. if (!dev_priv->scratch_page)
  291. goto out_err;
  292. set_pages_uc(dev_priv->scratch_page, 1);
  293. ret = psb_gtt_init(dev, 0);
  294. if (ret)
  295. goto out_err;
  296. dev_priv->mmu = psb_mmu_driver_init((void *)0,
  297. drm_psb_trap_pagefaults, 0,
  298. dev_priv);
  299. if (!dev_priv->mmu)
  300. goto out_err;
  301. pg = &dev_priv->gtt;
  302. tt_pages = (pg->gatt_pages < PSB_TT_PRIV0_PLIMIT) ?
  303. (pg->gatt_pages) : PSB_TT_PRIV0_PLIMIT;
  304. dev_priv->pf_pd = psb_mmu_alloc_pd(dev_priv->mmu, 1, 0);
  305. if (!dev_priv->pf_pd)
  306. goto out_err;
  307. psb_mmu_set_pd_context(psb_mmu_get_default_pd(dev_priv->mmu), 0);
  308. psb_mmu_set_pd_context(dev_priv->pf_pd, 1);
  309. ret = psb_do_init(dev);
  310. if (ret)
  311. return ret;
  312. PSB_WSGX32(0x20000000, PSB_CR_PDS_EXEC_BASE);
  313. PSB_WSGX32(0x30000000, PSB_CR_BIF_3D_REQ_BASE);
  314. /* igd_opregion_init(&dev_priv->opregion_dev); */
  315. acpi_video_register();
  316. if (dev_priv->lid_state)
  317. psb_lid_timer_init(dev_priv);
  318. ret = drm_vblank_init(dev, dev_priv->num_pipe);
  319. if (ret)
  320. goto out_err;
  321. /*
  322. * Install interrupt handlers prior to powering off SGX or else we will
  323. * crash.
  324. */
  325. dev_priv->vdc_irq_mask = 0;
  326. dev_priv->pipestat[0] = 0;
  327. dev_priv->pipestat[1] = 0;
  328. dev_priv->pipestat[2] = 0;
  329. spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
  330. PSB_WVDC32(0xFFFFFFFF, PSB_HWSTAM);
  331. PSB_WVDC32(0x00000000, PSB_INT_ENABLE_R);
  332. PSB_WVDC32(0xFFFFFFFF, PSB_INT_MASK_R);
  333. spin_unlock_irqrestore(&dev_priv->irqmask_lock, irqflags);
  334. if (drm_core_check_feature(dev, DRIVER_MODESET))
  335. drm_irq_install(dev);
  336. dev->vblank_disable_allowed = 1;
  337. dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
  338. dev->driver->get_vblank_counter = psb_get_vblank_counter;
  339. if (drm_psb_no_fb == 0) {
  340. psb_modeset_init(dev);
  341. psb_fbdev_init(dev);
  342. drm_kms_helper_poll_init(dev);
  343. }
  344. /* Only add backlight support if we have LVDS output */
  345. list_for_each_entry(connector, &dev->mode_config.connector_list,
  346. head) {
  347. psb_intel_output = to_psb_intel_output(connector);
  348. switch (psb_intel_output->type) {
  349. case INTEL_OUTPUT_LVDS:
  350. case INTEL_OUTPUT_MIPI:
  351. ret = gma_backlight_init(dev);
  352. break;
  353. }
  354. }
  355. if (ret)
  356. return ret;
  357. #if 0
  358. /*enable runtime pm at last*/
  359. pm_runtime_enable(&dev->pdev->dev);
  360. pm_runtime_set_active(&dev->pdev->dev);
  361. #endif
  362. /*Intel drm driver load is done, continue doing pvr load*/
  363. return 0;
  364. out_err:
  365. psb_driver_unload(dev);
  366. return ret;
  367. }
  368. int psb_driver_device_is_agp(struct drm_device *dev)
  369. {
  370. return 0;
  371. }
  372. static int psb_sizes_ioctl(struct drm_device *dev, void *data,
  373. struct drm_file *file_priv)
  374. {
  375. struct drm_psb_private *dev_priv = psb_priv(dev);
  376. struct drm_psb_sizes_arg *arg =
  377. (struct drm_psb_sizes_arg *) data;
  378. *arg = dev_priv->sizes;
  379. return 0;
  380. }
  381. static int psb_dc_state_ioctl(struct drm_device *dev, void * data,
  382. struct drm_file *file_priv)
  383. {
  384. uint32_t flags;
  385. uint32_t obj_id;
  386. struct drm_mode_object *obj;
  387. struct drm_connector *connector;
  388. struct drm_crtc *crtc;
  389. struct drm_psb_dc_state_arg *arg = data;
  390. /* Double check MRST case */
  391. if (IS_MRST(dev) || IS_MFLD(dev))
  392. return -EOPNOTSUPP;
  393. flags = arg->flags;
  394. obj_id = arg->obj_id;
  395. if (flags & PSB_DC_CRTC_MASK) {
  396. obj = drm_mode_object_find(dev, obj_id,
  397. DRM_MODE_OBJECT_CRTC);
  398. if (!obj) {
  399. dev_dbg(dev->dev, "Invalid CRTC object.\n");
  400. return -EINVAL;
  401. }
  402. crtc = obj_to_crtc(obj);
  403. mutex_lock(&dev->mode_config.mutex);
  404. if (drm_helper_crtc_in_use(crtc)) {
  405. if (flags & PSB_DC_CRTC_SAVE)
  406. crtc->funcs->save(crtc);
  407. else
  408. crtc->funcs->restore(crtc);
  409. }
  410. mutex_unlock(&dev->mode_config.mutex);
  411. return 0;
  412. } else if (flags & PSB_DC_OUTPUT_MASK) {
  413. obj = drm_mode_object_find(dev, obj_id,
  414. DRM_MODE_OBJECT_CONNECTOR);
  415. if (!obj) {
  416. dev_dbg(dev->dev, "Invalid connector id.\n");
  417. return -EINVAL;
  418. }
  419. connector = obj_to_connector(obj);
  420. if (flags & PSB_DC_OUTPUT_SAVE)
  421. connector->funcs->save(connector);
  422. else
  423. connector->funcs->restore(connector);
  424. return 0;
  425. }
  426. return -EINVAL;
  427. }
  428. static inline void get_brightness(struct backlight_device *bd)
  429. {
  430. #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE
  431. if (bd) {
  432. bd->props.brightness = bd->ops->get_brightness(bd);
  433. backlight_update_status(bd);
  434. }
  435. #endif
  436. }
  437. static int psb_dpst_bl_ioctl(struct drm_device *dev, void *data,
  438. struct drm_file *file_priv)
  439. {
  440. struct drm_psb_private *dev_priv = psb_priv(dev);
  441. uint32_t *arg = data;
  442. dev_priv->blc_adj2 = *arg;
  443. get_brightness(dev_priv->backlight_device);
  444. return 0;
  445. }
  446. static int psb_adb_ioctl(struct drm_device *dev, void *data,
  447. struct drm_file *file_priv)
  448. {
  449. struct drm_psb_private *dev_priv = psb_priv(dev);
  450. uint32_t *arg = data;
  451. dev_priv->blc_adj1 = *arg;
  452. get_brightness(dev_priv->backlight_device);
  453. return 0;
  454. }
  455. /* return the current mode to the dpst module */
  456. static int psb_dpst_ioctl(struct drm_device *dev, void *data,
  457. struct drm_file *file_priv)
  458. {
  459. struct drm_psb_private *dev_priv = psb_priv(dev);
  460. uint32_t *arg = data;
  461. uint32_t x;
  462. uint32_t y;
  463. uint32_t reg;
  464. if (!gma_power_begin(dev, 0))
  465. return -EIO;
  466. reg = PSB_RVDC32(PIPEASRC);
  467. gma_power_end(dev);
  468. /* horizontal is the left 16 bits */
  469. x = reg >> 16;
  470. /* vertical is the right 16 bits */
  471. y = reg & 0x0000ffff;
  472. /* the values are the image size minus one */
  473. x++;
  474. y++;
  475. *arg = (x << 16) | y;
  476. return 0;
  477. }
  478. static int psb_gamma_ioctl(struct drm_device *dev, void *data,
  479. struct drm_file *file_priv)
  480. {
  481. struct drm_psb_dpst_lut_arg *lut_arg = data;
  482. struct drm_mode_object *obj;
  483. struct drm_crtc *crtc;
  484. struct drm_connector *connector;
  485. struct psb_intel_crtc *psb_intel_crtc;
  486. int i = 0;
  487. int32_t obj_id;
  488. obj_id = lut_arg->output_id;
  489. obj = drm_mode_object_find(dev, obj_id, DRM_MODE_OBJECT_CONNECTOR);
  490. if (!obj) {
  491. dev_dbg(dev->dev, "Invalid Connector object.\n");
  492. return -EINVAL;
  493. }
  494. connector = obj_to_connector(obj);
  495. crtc = connector->encoder->crtc;
  496. psb_intel_crtc = to_psb_intel_crtc(crtc);
  497. for (i = 0; i < 256; i++)
  498. psb_intel_crtc->lut_adj[i] = lut_arg->lut[i];
  499. psb_intel_crtc_load_lut(crtc);
  500. return 0;
  501. }
  502. static int psb_mode_operation_ioctl(struct drm_device *dev, void *data,
  503. struct drm_file *file_priv)
  504. {
  505. uint32_t obj_id;
  506. uint16_t op;
  507. struct drm_mode_modeinfo *umode;
  508. struct drm_display_mode *mode = NULL;
  509. struct drm_psb_mode_operation_arg *arg;
  510. struct drm_mode_object *obj;
  511. struct drm_connector *connector;
  512. struct drm_framebuffer *drm_fb;
  513. struct psb_framebuffer *psb_fb;
  514. struct drm_connector_helper_funcs *connector_funcs;
  515. int ret = 0;
  516. int resp = MODE_OK;
  517. struct drm_psb_private *dev_priv = psb_priv(dev);
  518. arg = (struct drm_psb_mode_operation_arg *)data;
  519. obj_id = arg->obj_id;
  520. op = arg->operation;
  521. switch (op) {
  522. case PSB_MODE_OPERATION_SET_DC_BASE:
  523. obj = drm_mode_object_find(dev, obj_id, DRM_MODE_OBJECT_FB);
  524. if (!obj) {
  525. dev_dbg(dev->dev, "Invalid FB id %d\n", obj_id);
  526. return -EINVAL;
  527. }
  528. drm_fb = obj_to_fb(obj);
  529. psb_fb = to_psb_fb(drm_fb);
  530. if (gma_power_begin(dev, 0)) {
  531. REG_WRITE(DSPASURF, psb_fb->gtt->offset);
  532. REG_READ(DSPASURF);
  533. gma_power_end(dev);
  534. } else {
  535. dev_priv->saveDSPASURF = psb_fb->gtt->offset;
  536. }
  537. return 0;
  538. case PSB_MODE_OPERATION_MODE_VALID:
  539. umode = &arg->mode;
  540. mutex_lock(&dev->mode_config.mutex);
  541. obj = drm_mode_object_find(dev, obj_id,
  542. DRM_MODE_OBJECT_CONNECTOR);
  543. if (!obj) {
  544. ret = -EINVAL;
  545. goto mode_op_out;
  546. }
  547. connector = obj_to_connector(obj);
  548. mode = drm_mode_create(dev);
  549. if (!mode) {
  550. ret = -ENOMEM;
  551. goto mode_op_out;
  552. }
  553. /* drm_crtc_convert_umode(mode, umode); */
  554. {
  555. mode->clock = umode->clock;
  556. mode->hdisplay = umode->hdisplay;
  557. mode->hsync_start = umode->hsync_start;
  558. mode->hsync_end = umode->hsync_end;
  559. mode->htotal = umode->htotal;
  560. mode->hskew = umode->hskew;
  561. mode->vdisplay = umode->vdisplay;
  562. mode->vsync_start = umode->vsync_start;
  563. mode->vsync_end = umode->vsync_end;
  564. mode->vtotal = umode->vtotal;
  565. mode->vscan = umode->vscan;
  566. mode->vrefresh = umode->vrefresh;
  567. mode->flags = umode->flags;
  568. mode->type = umode->type;
  569. strncpy(mode->name, umode->name, DRM_DISPLAY_MODE_LEN);
  570. mode->name[DRM_DISPLAY_MODE_LEN-1] = 0;
  571. }
  572. connector_funcs = (struct drm_connector_helper_funcs *)
  573. connector->helper_private;
  574. if (connector_funcs->mode_valid) {
  575. resp = connector_funcs->mode_valid(connector, mode);
  576. arg->data = (void *)resp;
  577. }
  578. /*do some clean up work*/
  579. if (mode)
  580. drm_mode_destroy(dev, mode);
  581. mode_op_out:
  582. mutex_unlock(&dev->mode_config.mutex);
  583. return ret;
  584. default:
  585. dev_dbg(dev->dev, "Unsupported psb mode operation\n");
  586. return -EOPNOTSUPP;
  587. }
  588. return 0;
  589. }
  590. static int psb_stolen_memory_ioctl(struct drm_device *dev, void *data,
  591. struct drm_file *file_priv)
  592. {
  593. struct drm_psb_private *dev_priv = psb_priv(dev);
  594. struct drm_psb_stolen_memory_arg *arg = data;
  595. arg->base = dev_priv->stolen_base;
  596. arg->size = dev_priv->vram_stolen_size;
  597. return 0;
  598. }
  599. /* FIXME: needs Medfield changes */
  600. static int psb_register_rw_ioctl(struct drm_device *dev, void *data,
  601. struct drm_file *file_priv)
  602. {
  603. struct drm_psb_private *dev_priv = psb_priv(dev);
  604. struct drm_psb_register_rw_arg *arg = data;
  605. bool usage = arg->b_force_hw_on ? true : false;
  606. if (arg->display_write_mask != 0) {
  607. if (gma_power_begin(dev, usage)) {
  608. if (arg->display_write_mask & REGRWBITS_PFIT_CONTROLS)
  609. PSB_WVDC32(arg->display.pfit_controls,
  610. PFIT_CONTROL);
  611. if (arg->display_write_mask &
  612. REGRWBITS_PFIT_AUTOSCALE_RATIOS)
  613. PSB_WVDC32(arg->display.pfit_autoscale_ratios,
  614. PFIT_AUTO_RATIOS);
  615. if (arg->display_write_mask &
  616. REGRWBITS_PFIT_PROGRAMMED_SCALE_RATIOS)
  617. PSB_WVDC32(
  618. arg->display.pfit_programmed_scale_ratios,
  619. PFIT_PGM_RATIOS);
  620. if (arg->display_write_mask & REGRWBITS_PIPEASRC)
  621. PSB_WVDC32(arg->display.pipeasrc,
  622. PIPEASRC);
  623. if (arg->display_write_mask & REGRWBITS_PIPEBSRC)
  624. PSB_WVDC32(arg->display.pipebsrc,
  625. PIPEBSRC);
  626. if (arg->display_write_mask & REGRWBITS_VTOTAL_A)
  627. PSB_WVDC32(arg->display.vtotal_a,
  628. VTOTAL_A);
  629. if (arg->display_write_mask & REGRWBITS_VTOTAL_B)
  630. PSB_WVDC32(arg->display.vtotal_b,
  631. VTOTAL_B);
  632. gma_power_end(dev);
  633. } else {
  634. if (arg->display_write_mask & REGRWBITS_PFIT_CONTROLS)
  635. dev_priv->savePFIT_CONTROL =
  636. arg->display.pfit_controls;
  637. if (arg->display_write_mask &
  638. REGRWBITS_PFIT_AUTOSCALE_RATIOS)
  639. dev_priv->savePFIT_AUTO_RATIOS =
  640. arg->display.pfit_autoscale_ratios;
  641. if (arg->display_write_mask &
  642. REGRWBITS_PFIT_PROGRAMMED_SCALE_RATIOS)
  643. dev_priv->savePFIT_PGM_RATIOS =
  644. arg->display.pfit_programmed_scale_ratios;
  645. if (arg->display_write_mask & REGRWBITS_PIPEASRC)
  646. dev_priv->savePIPEASRC = arg->display.pipeasrc;
  647. if (arg->display_write_mask & REGRWBITS_PIPEBSRC)
  648. dev_priv->savePIPEBSRC = arg->display.pipebsrc;
  649. if (arg->display_write_mask & REGRWBITS_VTOTAL_A)
  650. dev_priv->saveVTOTAL_A = arg->display.vtotal_a;
  651. if (arg->display_write_mask & REGRWBITS_VTOTAL_B)
  652. dev_priv->saveVTOTAL_B = arg->display.vtotal_b;
  653. }
  654. }
  655. if (arg->display_read_mask != 0) {
  656. if (gma_power_begin(dev, usage)) {
  657. if (arg->display_read_mask &
  658. REGRWBITS_PFIT_CONTROLS)
  659. arg->display.pfit_controls =
  660. PSB_RVDC32(PFIT_CONTROL);
  661. if (arg->display_read_mask &
  662. REGRWBITS_PFIT_AUTOSCALE_RATIOS)
  663. arg->display.pfit_autoscale_ratios =
  664. PSB_RVDC32(PFIT_AUTO_RATIOS);
  665. if (arg->display_read_mask &
  666. REGRWBITS_PFIT_PROGRAMMED_SCALE_RATIOS)
  667. arg->display.pfit_programmed_scale_ratios =
  668. PSB_RVDC32(PFIT_PGM_RATIOS);
  669. if (arg->display_read_mask & REGRWBITS_PIPEASRC)
  670. arg->display.pipeasrc = PSB_RVDC32(PIPEASRC);
  671. if (arg->display_read_mask & REGRWBITS_PIPEBSRC)
  672. arg->display.pipebsrc = PSB_RVDC32(PIPEBSRC);
  673. if (arg->display_read_mask & REGRWBITS_VTOTAL_A)
  674. arg->display.vtotal_a = PSB_RVDC32(VTOTAL_A);
  675. if (arg->display_read_mask & REGRWBITS_VTOTAL_B)
  676. arg->display.vtotal_b = PSB_RVDC32(VTOTAL_B);
  677. gma_power_end(dev);
  678. } else {
  679. if (arg->display_read_mask &
  680. REGRWBITS_PFIT_CONTROLS)
  681. arg->display.pfit_controls =
  682. dev_priv->savePFIT_CONTROL;
  683. if (arg->display_read_mask &
  684. REGRWBITS_PFIT_AUTOSCALE_RATIOS)
  685. arg->display.pfit_autoscale_ratios =
  686. dev_priv->savePFIT_AUTO_RATIOS;
  687. if (arg->display_read_mask &
  688. REGRWBITS_PFIT_PROGRAMMED_SCALE_RATIOS)
  689. arg->display.pfit_programmed_scale_ratios =
  690. dev_priv->savePFIT_PGM_RATIOS;
  691. if (arg->display_read_mask & REGRWBITS_PIPEASRC)
  692. arg->display.pipeasrc = dev_priv->savePIPEASRC;
  693. if (arg->display_read_mask & REGRWBITS_PIPEBSRC)
  694. arg->display.pipebsrc = dev_priv->savePIPEBSRC;
  695. if (arg->display_read_mask & REGRWBITS_VTOTAL_A)
  696. arg->display.vtotal_a = dev_priv->saveVTOTAL_A;
  697. if (arg->display_read_mask & REGRWBITS_VTOTAL_B)
  698. arg->display.vtotal_b = dev_priv->saveVTOTAL_B;
  699. }
  700. }
  701. if (arg->overlay_write_mask != 0) {
  702. if (gma_power_begin(dev, usage)) {
  703. if (arg->overlay_write_mask & OV_REGRWBITS_OGAM_ALL) {
  704. PSB_WVDC32(arg->overlay.OGAMC5, OV_OGAMC5);
  705. PSB_WVDC32(arg->overlay.OGAMC4, OV_OGAMC4);
  706. PSB_WVDC32(arg->overlay.OGAMC3, OV_OGAMC3);
  707. PSB_WVDC32(arg->overlay.OGAMC2, OV_OGAMC2);
  708. PSB_WVDC32(arg->overlay.OGAMC1, OV_OGAMC1);
  709. PSB_WVDC32(arg->overlay.OGAMC0, OV_OGAMC0);
  710. }
  711. if (arg->overlay_write_mask & OVC_REGRWBITS_OGAM_ALL) {
  712. PSB_WVDC32(arg->overlay.OGAMC5, OVC_OGAMC5);
  713. PSB_WVDC32(arg->overlay.OGAMC4, OVC_OGAMC4);
  714. PSB_WVDC32(arg->overlay.OGAMC3, OVC_OGAMC3);
  715. PSB_WVDC32(arg->overlay.OGAMC2, OVC_OGAMC2);
  716. PSB_WVDC32(arg->overlay.OGAMC1, OVC_OGAMC1);
  717. PSB_WVDC32(arg->overlay.OGAMC0, OVC_OGAMC0);
  718. }
  719. if (arg->overlay_write_mask & OV_REGRWBITS_OVADD) {
  720. PSB_WVDC32(arg->overlay.OVADD, OV_OVADD);
  721. if (arg->overlay.b_wait_vblank) {
  722. /* Wait for 20ms.*/
  723. unsigned long vblank_timeout = jiffies
  724. + HZ/50;
  725. uint32_t temp;
  726. while (time_before_eq(jiffies,
  727. vblank_timeout)) {
  728. temp = PSB_RVDC32(OV_DOVASTA);
  729. if ((temp & (0x1 << 31)) != 0)
  730. break;
  731. cpu_relax();
  732. }
  733. }
  734. }
  735. if (arg->overlay_write_mask & OVC_REGRWBITS_OVADD) {
  736. PSB_WVDC32(arg->overlay.OVADD, OVC_OVADD);
  737. if (arg->overlay.b_wait_vblank) {
  738. /* Wait for 20ms.*/
  739. unsigned long vblank_timeout =
  740. jiffies + HZ/50;
  741. uint32_t temp;
  742. while (time_before_eq(jiffies,
  743. vblank_timeout)) {
  744. temp = PSB_RVDC32(OVC_DOVCSTA);
  745. if ((temp & (0x1 << 31)) != 0)
  746. break;
  747. cpu_relax();
  748. }
  749. }
  750. }
  751. gma_power_end(dev);
  752. } else {
  753. if (arg->overlay_write_mask & OV_REGRWBITS_OGAM_ALL) {
  754. dev_priv->saveOV_OGAMC5 = arg->overlay.OGAMC5;
  755. dev_priv->saveOV_OGAMC4 = arg->overlay.OGAMC4;
  756. dev_priv->saveOV_OGAMC3 = arg->overlay.OGAMC3;
  757. dev_priv->saveOV_OGAMC2 = arg->overlay.OGAMC2;
  758. dev_priv->saveOV_OGAMC1 = arg->overlay.OGAMC1;
  759. dev_priv->saveOV_OGAMC0 = arg->overlay.OGAMC0;
  760. }
  761. if (arg->overlay_write_mask & OVC_REGRWBITS_OGAM_ALL) {
  762. dev_priv->saveOVC_OGAMC5 = arg->overlay.OGAMC5;
  763. dev_priv->saveOVC_OGAMC4 = arg->overlay.OGAMC4;
  764. dev_priv->saveOVC_OGAMC3 = arg->overlay.OGAMC3;
  765. dev_priv->saveOVC_OGAMC2 = arg->overlay.OGAMC2;
  766. dev_priv->saveOVC_OGAMC1 = arg->overlay.OGAMC1;
  767. dev_priv->saveOVC_OGAMC0 = arg->overlay.OGAMC0;
  768. }
  769. if (arg->overlay_write_mask & OV_REGRWBITS_OVADD)
  770. dev_priv->saveOV_OVADD = arg->overlay.OVADD;
  771. if (arg->overlay_write_mask & OVC_REGRWBITS_OVADD)
  772. dev_priv->saveOVC_OVADD = arg->overlay.OVADD;
  773. }
  774. }
  775. if (arg->overlay_read_mask != 0) {
  776. if (gma_power_begin(dev, usage)) {
  777. if (arg->overlay_read_mask & OV_REGRWBITS_OGAM_ALL) {
  778. arg->overlay.OGAMC5 = PSB_RVDC32(OV_OGAMC5);
  779. arg->overlay.OGAMC4 = PSB_RVDC32(OV_OGAMC4);
  780. arg->overlay.OGAMC3 = PSB_RVDC32(OV_OGAMC3);
  781. arg->overlay.OGAMC2 = PSB_RVDC32(OV_OGAMC2);
  782. arg->overlay.OGAMC1 = PSB_RVDC32(OV_OGAMC1);
  783. arg->overlay.OGAMC0 = PSB_RVDC32(OV_OGAMC0);
  784. }
  785. if (arg->overlay_read_mask & OVC_REGRWBITS_OGAM_ALL) {
  786. arg->overlay.OGAMC5 = PSB_RVDC32(OVC_OGAMC5);
  787. arg->overlay.OGAMC4 = PSB_RVDC32(OVC_OGAMC4);
  788. arg->overlay.OGAMC3 = PSB_RVDC32(OVC_OGAMC3);
  789. arg->overlay.OGAMC2 = PSB_RVDC32(OVC_OGAMC2);
  790. arg->overlay.OGAMC1 = PSB_RVDC32(OVC_OGAMC1);
  791. arg->overlay.OGAMC0 = PSB_RVDC32(OVC_OGAMC0);
  792. }
  793. if (arg->overlay_read_mask & OV_REGRWBITS_OVADD)
  794. arg->overlay.OVADD = PSB_RVDC32(OV_OVADD);
  795. if (arg->overlay_read_mask & OVC_REGRWBITS_OVADD)
  796. arg->overlay.OVADD = PSB_RVDC32(OVC_OVADD);
  797. gma_power_end(dev);
  798. } else {
  799. if (arg->overlay_read_mask & OV_REGRWBITS_OGAM_ALL) {
  800. arg->overlay.OGAMC5 = dev_priv->saveOV_OGAMC5;
  801. arg->overlay.OGAMC4 = dev_priv->saveOV_OGAMC4;
  802. arg->overlay.OGAMC3 = dev_priv->saveOV_OGAMC3;
  803. arg->overlay.OGAMC2 = dev_priv->saveOV_OGAMC2;
  804. arg->overlay.OGAMC1 = dev_priv->saveOV_OGAMC1;
  805. arg->overlay.OGAMC0 = dev_priv->saveOV_OGAMC0;
  806. }
  807. if (arg->overlay_read_mask & OVC_REGRWBITS_OGAM_ALL) {
  808. arg->overlay.OGAMC5 = dev_priv->saveOVC_OGAMC5;
  809. arg->overlay.OGAMC4 = dev_priv->saveOVC_OGAMC4;
  810. arg->overlay.OGAMC3 = dev_priv->saveOVC_OGAMC3;
  811. arg->overlay.OGAMC2 = dev_priv->saveOVC_OGAMC2;
  812. arg->overlay.OGAMC1 = dev_priv->saveOVC_OGAMC1;
  813. arg->overlay.OGAMC0 = dev_priv->saveOVC_OGAMC0;
  814. }
  815. if (arg->overlay_read_mask & OV_REGRWBITS_OVADD)
  816. arg->overlay.OVADD = dev_priv->saveOV_OVADD;
  817. if (arg->overlay_read_mask & OVC_REGRWBITS_OVADD)
  818. arg->overlay.OVADD = dev_priv->saveOVC_OVADD;
  819. }
  820. }
  821. if (arg->sprite_enable_mask != 0) {
  822. if (gma_power_begin(dev, usage)) {
  823. PSB_WVDC32(0x1F3E, DSPARB);
  824. PSB_WVDC32(arg->sprite.dspa_control
  825. | PSB_RVDC32(DSPACNTR), DSPACNTR);
  826. PSB_WVDC32(arg->sprite.dspa_key_value, DSPAKEYVAL);
  827. PSB_WVDC32(arg->sprite.dspa_key_mask, DSPAKEYMASK);
  828. PSB_WVDC32(PSB_RVDC32(DSPASURF), DSPASURF);
  829. PSB_RVDC32(DSPASURF);
  830. PSB_WVDC32(arg->sprite.dspc_control, DSPCCNTR);
  831. PSB_WVDC32(arg->sprite.dspc_stride, DSPCSTRIDE);
  832. PSB_WVDC32(arg->sprite.dspc_position, DSPCPOS);
  833. PSB_WVDC32(arg->sprite.dspc_linear_offset, DSPCLINOFF);
  834. PSB_WVDC32(arg->sprite.dspc_size, DSPCSIZE);
  835. PSB_WVDC32(arg->sprite.dspc_surface, DSPCSURF);
  836. PSB_RVDC32(DSPCSURF);
  837. gma_power_end(dev);
  838. }
  839. }
  840. if (arg->sprite_disable_mask != 0) {
  841. if (gma_power_begin(dev, usage)) {
  842. PSB_WVDC32(0x3F3E, DSPARB);
  843. PSB_WVDC32(0x0, DSPCCNTR);
  844. PSB_WVDC32(arg->sprite.dspc_surface, DSPCSURF);
  845. PSB_RVDC32(DSPCSURF);
  846. gma_power_end(dev);
  847. }
  848. }
  849. if (arg->subpicture_enable_mask != 0) {
  850. if (gma_power_begin(dev, usage)) {
  851. uint32_t temp;
  852. if (arg->subpicture_enable_mask & REGRWBITS_DSPACNTR) {
  853. temp = PSB_RVDC32(DSPACNTR);
  854. temp &= ~DISPPLANE_PIXFORMAT_MASK;
  855. temp &= ~DISPPLANE_BOTTOM;
  856. temp |= DISPPLANE_32BPP;
  857. PSB_WVDC32(temp, DSPACNTR);
  858. temp = PSB_RVDC32(DSPABASE);
  859. PSB_WVDC32(temp, DSPABASE);
  860. PSB_RVDC32(DSPABASE);
  861. temp = PSB_RVDC32(DSPASURF);
  862. PSB_WVDC32(temp, DSPASURF);
  863. PSB_RVDC32(DSPASURF);
  864. }
  865. if (arg->subpicture_enable_mask & REGRWBITS_DSPBCNTR) {
  866. temp = PSB_RVDC32(DSPBCNTR);
  867. temp &= ~DISPPLANE_PIXFORMAT_MASK;
  868. temp &= ~DISPPLANE_BOTTOM;
  869. temp |= DISPPLANE_32BPP;
  870. PSB_WVDC32(temp, DSPBCNTR);
  871. temp = PSB_RVDC32(DSPBBASE);
  872. PSB_WVDC32(temp, DSPBBASE);
  873. PSB_RVDC32(DSPBBASE);
  874. temp = PSB_RVDC32(DSPBSURF);
  875. PSB_WVDC32(temp, DSPBSURF);
  876. PSB_RVDC32(DSPBSURF);
  877. }
  878. if (arg->subpicture_enable_mask & REGRWBITS_DSPCCNTR) {
  879. temp = PSB_RVDC32(DSPCCNTR);
  880. temp &= ~DISPPLANE_PIXFORMAT_MASK;
  881. temp &= ~DISPPLANE_BOTTOM;
  882. temp |= DISPPLANE_32BPP;
  883. PSB_WVDC32(temp, DSPCCNTR);
  884. temp = PSB_RVDC32(DSPCBASE);
  885. PSB_WVDC32(temp, DSPCBASE);
  886. PSB_RVDC32(DSPCBASE);
  887. temp = PSB_RVDC32(DSPCSURF);
  888. PSB_WVDC32(temp, DSPCSURF);
  889. PSB_RVDC32(DSPCSURF);
  890. }
  891. gma_power_end(dev);
  892. }
  893. }
  894. if (arg->subpicture_disable_mask != 0) {
  895. if (gma_power_begin(dev, usage)) {
  896. uint32_t temp;
  897. if (arg->subpicture_disable_mask & REGRWBITS_DSPACNTR) {
  898. temp = PSB_RVDC32(DSPACNTR);
  899. temp &= ~DISPPLANE_PIXFORMAT_MASK;
  900. temp |= DISPPLANE_32BPP_NO_ALPHA;
  901. PSB_WVDC32(temp, DSPACNTR);
  902. temp = PSB_RVDC32(DSPABASE);
  903. PSB_WVDC32(temp, DSPABASE);
  904. PSB_RVDC32(DSPABASE);
  905. temp = PSB_RVDC32(DSPASURF);
  906. PSB_WVDC32(temp, DSPASURF);
  907. PSB_RVDC32(DSPASURF);
  908. }
  909. if (arg->subpicture_disable_mask & REGRWBITS_DSPBCNTR) {
  910. temp = PSB_RVDC32(DSPBCNTR);
  911. temp &= ~DISPPLANE_PIXFORMAT_MASK;
  912. temp |= DISPPLANE_32BPP_NO_ALPHA;
  913. PSB_WVDC32(temp, DSPBCNTR);
  914. temp = PSB_RVDC32(DSPBBASE);
  915. PSB_WVDC32(temp, DSPBBASE);
  916. PSB_RVDC32(DSPBBASE);
  917. temp = PSB_RVDC32(DSPBSURF);
  918. PSB_WVDC32(temp, DSPBSURF);
  919. PSB_RVDC32(DSPBSURF);
  920. }
  921. if (arg->subpicture_disable_mask & REGRWBITS_DSPCCNTR) {
  922. temp = PSB_RVDC32(DSPCCNTR);
  923. temp &= ~DISPPLANE_PIXFORMAT_MASK;
  924. temp |= DISPPLANE_32BPP_NO_ALPHA;
  925. PSB_WVDC32(temp, DSPCCNTR);
  926. temp = PSB_RVDC32(DSPCBASE);
  927. PSB_WVDC32(temp, DSPCBASE);
  928. PSB_RVDC32(DSPCBASE);
  929. temp = PSB_RVDC32(DSPCSURF);
  930. PSB_WVDC32(temp, DSPCSURF);
  931. PSB_RVDC32(DSPCSURF);
  932. }
  933. gma_power_end(dev);
  934. }
  935. }
  936. return 0;
  937. }
  938. static int psb_driver_open(struct drm_device *dev, struct drm_file *priv)
  939. {
  940. return 0;
  941. }
  942. static void psb_driver_close(struct drm_device *dev, struct drm_file *priv)
  943. {
  944. }
  945. static long psb_unlocked_ioctl(struct file *filp, unsigned int cmd,
  946. unsigned long arg)
  947. {
  948. struct drm_file *file_priv = filp->private_data;
  949. struct drm_device *dev = file_priv->minor->dev;
  950. struct drm_psb_private *dev_priv = dev->dev_private;
  951. static unsigned int runtime_allowed;
  952. if (runtime_allowed == 1 && dev_priv->is_lvds_on) {
  953. runtime_allowed++;
  954. pm_runtime_allow(&dev->pdev->dev);
  955. dev_priv->rpm_enabled = 1;
  956. }
  957. return drm_ioctl(filp, cmd, arg);
  958. /* FIXME: do we need to wrap the other side of this */
  959. }
  960. /* When a client dies:
  961. * - Check for and clean up flipped page state
  962. */
  963. void psb_driver_preclose(struct drm_device *dev, struct drm_file *priv)
  964. {
  965. }
  966. static void psb_remove(struct pci_dev *pdev)
  967. {
  968. struct drm_device *dev = pci_get_drvdata(pdev);
  969. drm_put_dev(dev);
  970. }
  971. static const struct dev_pm_ops psb_pm_ops = {
  972. .resume = gma_power_resume,
  973. .suspend = gma_power_suspend,
  974. .runtime_suspend = psb_runtime_suspend,
  975. .runtime_resume = psb_runtime_resume,
  976. .runtime_idle = psb_runtime_idle,
  977. };
  978. static struct vm_operations_struct psb_gem_vm_ops = {
  979. .fault = psb_gem_fault,
  980. .open = drm_gem_vm_open,
  981. .close = drm_gem_vm_close,
  982. };
  983. static struct drm_driver driver = {
  984. .driver_features = DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | \
  985. DRIVER_IRQ_VBL | DRIVER_MODESET | DRIVER_GEM ,
  986. .load = psb_driver_load,
  987. .unload = psb_driver_unload,
  988. .ioctls = psb_ioctls,
  989. .num_ioctls = DRM_ARRAY_SIZE(psb_ioctls),
  990. .device_is_agp = psb_driver_device_is_agp,
  991. .irq_preinstall = psb_irq_preinstall,
  992. .irq_postinstall = psb_irq_postinstall,
  993. .irq_uninstall = psb_irq_uninstall,
  994. .irq_handler = psb_irq_handler,
  995. .enable_vblank = psb_enable_vblank,
  996. .disable_vblank = psb_disable_vblank,
  997. .get_vblank_counter = psb_get_vblank_counter,
  998. .lastclose = psb_lastclose,
  999. .open = psb_driver_open,
  1000. .preclose = psb_driver_preclose,
  1001. .postclose = psb_driver_close,
  1002. .reclaim_buffers = drm_core_reclaim_buffers,
  1003. .gem_init_object = psb_gem_init_object,
  1004. .gem_free_object = psb_gem_free_object,
  1005. .gem_vm_ops = &psb_gem_vm_ops,
  1006. .dumb_create = psb_gem_dumb_create,
  1007. .dumb_map_offset = psb_gem_dumb_map_gtt,
  1008. .dumb_destroy = psb_gem_dumb_destroy,
  1009. .fops = {
  1010. .owner = THIS_MODULE,
  1011. .open = drm_open,
  1012. .release = drm_release,
  1013. .unlocked_ioctl = psb_unlocked_ioctl,
  1014. .mmap = drm_gem_mmap,
  1015. .poll = drm_poll,
  1016. .fasync = drm_fasync,
  1017. .read = drm_read,
  1018. },
  1019. .name = DRIVER_NAME,
  1020. .desc = DRIVER_DESC,
  1021. .date = PSB_DRM_DRIVER_DATE,
  1022. .major = PSB_DRM_DRIVER_MAJOR,
  1023. .minor = PSB_DRM_DRIVER_MINOR,
  1024. .patchlevel = PSB_DRM_DRIVER_PATCHLEVEL
  1025. };
  1026. static struct pci_driver psb_pci_driver = {
  1027. .name = DRIVER_NAME,
  1028. .id_table = pciidlist,
  1029. .probe = psb_probe,
  1030. .remove = psb_remove,
  1031. .driver.pm = &psb_pm_ops,
  1032. };
  1033. static int psb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
  1034. {
  1035. /* MLD Added this from Inaky's patch */
  1036. if (pci_enable_msi(pdev))
  1037. dev_warn(&pdev->dev, "Enable MSI failed!\n");
  1038. return drm_get_pci_dev(pdev, ent, &driver);
  1039. }
  1040. static int __init psb_init(void)
  1041. {
  1042. return drm_pci_init(&driver, &psb_pci_driver);
  1043. }
  1044. static void __exit psb_exit(void)
  1045. {
  1046. drm_pci_exit(&driver, &psb_pci_driver);
  1047. }
  1048. late_initcall(psb_init);
  1049. module_exit(psb_exit);
  1050. MODULE_AUTHOR("Alan Cox <alan@linux.intel.com> and others");
  1051. MODULE_DESCRIPTION(DRIVER_DESC);
  1052. MODULE_LICENSE("GPL");