Why open source rocks – a new SM750 (Silicon Motion GPU) HDMI Driver

Aug 31, 2026 01:49 AM - 1 hour ago 3

Push this paper to existent 2048-wide output aliases a software-scaled 2560x1080 ultrawide desktop, pinch bandwidth-saving colour conversion and update optimisations for smoother performance.

Linux show driver for the single-HDMI SE-DP750A-HDMI PCIe card.

Experimental: this driver is for 1 circumstantial SM750 board. Optional modes can transcend published GPU aliases show timepiece limits and whitethorn nutrient nary signal, distortion, aliases an unstable display. Keep SSH aliases different betterment route available erstwhile trying non-EDID modes.

The tested committee is sold aliases marked arsenic SE-DP750A-HDMI and has each of these:

  • Silicon Motion SM750G10-AC, revision A1
  • PCI ID 126f:0750
  • Silicon Image/Lattice SiI9024ACNU HDMI transmitter
  • 16 MiB show memory
  • One HDMI output

The PCI ID unsocial is not enough. Other SM750 cards whitethorn usage VGA, a different transmitter, aliases different GPIO wiring and are not presently supported.

Ubuntu 24.04 and Linux Mint 22 users tin build a DKMS package locally:

sudo apt update sudo apt instal build-essential dkms linux-headers-$(uname -r) libdrm-dev git git clone https://github.com/KodeMunkie/sm750hdmifb.git cd sm750hdmifb make check ./build-package.sh sudo apt instal ./dist/sm750hdmifb_0.5.5_all.deb sudo reboot

The reboot matters: it lets the package blacklist Linux's aged sm750fb driver before it tin declare the card. The package is named sm750hdmifb; the kernel module is sm750hdmidrm.ko truthful it cannot beryllium confused pinch sm750fb.ko.

The driver is intended for Linux 6.17 and newer. DKMS deliberately refuses older kernels because the required DRM interfaces are not supported by this project. The root has compatibility paths for Linux 6.17 done the 6.x series and for Linux 7.0 onward. It presently builds and passes the afloat test suite against 6.17 and 7.0 Ubuntu kernels; the manual CI workflow besides builds against Ubuntu 24.04's 6.17 kernel headers.

There is nary fixed precocious type cap, but early kernels tin alteration soul DRM APIs. Because this is an out-of-tree driver, a caller kernel type whitethorn require a source update moreover though it falls wrong the intended 6.17+ range.

Prebuilt packages, erstwhile available, are published under GitHub Releases. Building locally is recommended because DKMS compiles against the installed kernel headers.

By default the driver:

  • Uses show EDID modes
  • Uses dithered 16-bit RGB565 scanout
  • Uses a hardware cursor
  • Coalesces updates connected a worker
  • Uploads eight-row batches pinch DMA
  • Falls backmost safely if DMA fails

Applications still render successful 32-bit colour. Immediately earlier upload, the driver converts changed surface regions to RGB565 and applies KodeMunkie's ordered dither pinch a 94% green-channel correction. This is the default because the SM750 framebuffer is reached complete a PCIe 1.1 x1 link. At the higher resolutions that nexus cannot supply responsive full-screen 32-bit updates: XRGB8888 sends 4 bytes per output pixel, while RGB565 sends two. Dithered RGB565 truthful halves device-bound pixel postulation while preserving overmuch of the evident colour detail.

Common kernel aliases GRUB options are:

The array omits the communal sm750hdmidrm. prefix to support it readable. For example, participate enable_dma=0 arsenic sm750hdmidrm.enable_dma=0 successful GRUB.

Option and default When to specify it Effect and tradeoff
scanout_format=rgb565-bbdither
Default: rgb565-bbdither
No need; this is the recommended default Dithered 16-bit scanout pinch greenish correction
scanout_format=xrgb8888
Default: rgb565-bbdither
Only for 32-bit scanout Disables RGB565, dither and greenish correction; doubles upload postulation and tin lag astatine precocious resolutions
scanout_format=rgb565
Default: rgb565-bbdither
Only for plain RGB565 Disables the dither and greenish correction, reducing colour quality
dither_green_gain=94
Default: 94
No need; correction is connected by default Enables the tuned greenish correction while dithering
dither_green_gain=100
Default: 94
To move greenish correction off Keeps the dither but whitethorn nutrient a greener colour balance
enable_dma=1
Default: 1
No need; DMA is connected by default Verified eight-row DMA uploads pinch automatic CPU fallback
enable_dma=0
Default: 1
To disable DMA Forces CPU uploads, usually pinch little update performance
disable_hardware_cursor=1
Default: 0
For the package cursor fallback Disables the hardware cursor and whitethorn trim cursor responsiveness
edid_only=0
Default: 1
Required for the driver catalogue and ultrawide modes DANGEROUS: STOPS EDID RESTRICTING MODES AND CLOCKS THE MONITOR MAY NOT SUPPORT
softscale_wide=1
Default: 0
Required for 2464x1080 and 2560x1080; besides group edid_only=0 DANGEROUS / EXPERIMENTAL: ENABLES WIDE COMPRESSION AND REQUIRES MONITOR STRETCHING
sharpen=1
Default: 0
Recommended pinch ultrawide modes Adds fixed 8% opposition sharpening aft compression
double_shadow=1
Default: 0
Recommended to debar redundant uploads Adds root and output comparison snapshots; skips unchanged pixels but uses much strategy memory. This is not front/back page flipping
async_updates=1
Default: 1
No need; enabled by default Keeps only the latest pending update alternatively of queuing old frames

Add options to the existing GRUB_CMDLINE_LINUX_DEFAULT worth in /etc/default/grub, past use them with:

sudo update-grub sudo reboot

Every action and its default is listed in Module parameters.

The instrumentality is usually described arsenic supporting up to 1920 pixels horizontally. With edid_only=0, the driver besides exposes these existent 2048-wide hardware modes:

Desktop and HDMI mode Refresh rates Output and risk
2048x864 59.94, 60, 70, 72, 75 Hz Native aliases monitor-scaled. EXPERIMENTAL: NOT RESTRICTED BY EDID
2048x1024 59.94, 60, 70, 72 Hz Native aliases monitor-scaled. EXPERIMENTAL: NOT RESTRICTED BY EDID
2048x1080 50, 59.94, 60, 70, 72, 75 Hz Native aliases monitor-scaled. EXPERIMENTAL: HIGH REFRESH MAY EXCEED SPECIFICATION
2048x1152 59.94, 60 Hz Native aliases monitor-scaled. EXPERIMENTAL: NOT RESTRICTED BY EDID

softscale_wide=1 adds 2 wider logical desktops. Both require a physical 2560x1080 ultrawide show pinch FULL WIDESCREEN STRETCH ENABLED successful its on-screen menu:

Logical desktop Physical monitor Width ratio HDMI and show path
2464x1080 2560x1080 77:64
16.9% compression
2048x1080 -> 2560x1080 stretch
2560x1080 2560x1080 5:4
20% compression
2048x1080 -> 2560x1080 stretch
Mode Refresh rates Guidance
2464x1080 50, 59.94, 60, 70, 72, 75 Hz RECOMMENDED: much item and amended responsiveness; alteration sharpen=1
2560x1080 50, 59.94, 60, 70, 72, 75 Hz Less item and little capacity because much width is compressed; spot the reasoning

For some modes, the HDMI awesome is stretched from 2048x1080 to the physical 2560x1080 pixels of a 2K ultrawide monitor.

2048 pixels is the highest existent width this paper tin nutrient successful hardware. The SM750 superior graphics level has an 11-bit right-edge field, truthful its physical scanout width cannot transcend 2048 pixels. This is simply a hardware constraint; reducing the tallness does not merchandise much horizontal bits. The 2464 and 2560 modes create wider workspaces successful software, but the paper still outputs only a 2048-pixel-wide signal.

An ultrawide show pinch its full-width aliases full-widescreen agelong option enabled is required for the intended result. The complete way is:

logical desktop -> driver compression -> 2048x1080 HDMI -> show agelong to 2560x1080 beingness pixels

The monitor's agelong mounting spatially expands the compressed 2048-pixel HDMI image crossed each 2560 beingness sheet pixels. It is not recovering mislaid source data, but it restores the intended ultrawide surface sum and approximately restores the intended facet ratio. What looks "correct" is subjective because the 2464 mode deliberately retains a mini facet difference.

Why 2464x1080 is recommended

For 2560x1080, the driver performs an optimized 5:4 simplification from 2560 to 2048 pixels, a 20% horizontal compression. A 2560-wide show past expands the 2048-pixel awesome by 25% backmost crossed its panel. This provides a true 2560x1080-sized workspace, but immoderate good horizontal item is necessarily combined during the first measurement and much root pixels must beryllium rendered and processed.

For a beingness 2560x1080 monitor, 2464x1080 is the recommended, higher-performance and often sharper mode. It starts with 3.75% less desktop pixels and compresses width by only 16.9% earlier sending the same 2048x1080 signal. The show still expands that awesome crossed 2560 panel pixels, truthful little root item was discarded by the driver, but the last image is astir 3.9% wider than its logical geometry. This flimsy facet distortion is generally difficult to announcement and is the tradeoff for improved responsiveness and perceived sharpness. Enabling sm750hdmidrm.sharpen=1 is recommended.

Both wide modes tin use a mini fixed 8% opposition sharpen aft compression. It restores immoderate separator meaning mislaid to filtering; it does not recreate discarded pixels. The dither and greenish correction are applied during the final RGB565 conversion earlier the 2048-wide scanout is uploaded.

This tested floor plan enables the driver mode catalogue and wide scaling:

DANGER: THIS PROFILE DISABLES EDID MODE RESTRICTIONS AND EXPOSES EXPERIMENTAL OR ABOVE-SPECIFICATION CLOCKS. A LISTED MODE MAY BLANK OR DESTABILIZE THE DISPLAY OR EXCEED A GPU, TRANSMITTER OR MONITOR LIMIT.

sm750hdmidrm.edid_only=0 sm750hdmidrm.softscale_wide=1 sm750hdmidrm.sharpen=1 sm750hdmidrm.scanout_format=rgb565-bbdither sm750hdmidrm.double_shadow=1 sm750hdmidrm.enable_dma=1

Some catalogue refresh rates tally the SM750 DVO way aliases the show outside published limits. A mode being listed does not guarantee that each monitor, cable, KVM, aliases adapter will judge it. See Modes and timepiece risks earlier experimenting.

rgb565-bbdither uses an 8x8 ordered dither conceived and tuned by KodeMunkie specifically for desktop usage connected this card. It includes an adjustable green-channel correction and anchors the shape to surface coordinates, so small updates do not make the shape crawl aliases time off mismatched patches.

The 3 images beneath visualise the complete ultrawide conversion process. Click immoderate preview to unfastened the original image. The logical desktop and physical photo are shown astatine 50% page width. The compressed preview is shown astatine 41.56%, preserving the 2048 / 2464 width simplification alternatively of stretching some digital stages to the aforesaid preview width.

Original 2464x1080 logical desktop

The driver receives this original 2464x1080 logical desktop.

2. Compressed HDMI scanout

The 2464x1080 desktop compressed to the SM750's 2048x1080 hardware scanout

The image supra deliberately looks horizontally squashed. It reproduces the 2048x1080 HDMI scanout generated by compressing the 2464x1080 logical desktop to the SM750's hardware-width limit.

3. Physical show result

The show stretching the SM750 scanout crossed its beingness ultrawide panel

The photographed consequence fills the monitor's 2560x1080 beingness pixels at 75 Hz, utilizing the driver's 16-bit rgb565-bbdither dithered scanout.

The monitor's FULL WIDESCREEN STRETCH action expands that awesome crossed its physical 2560x1080 panel. The complete way is therefore:

Logical desktop -> SM750 hardware scanout -> beingness panel, stretched by the monitor.

Check binding and caller driver messages:

lspci -nnk -d 126f:0750 journalctl -k -b | grep -iE 'sm750|sii902'

If an experimental mode gives nary signal, footwear an older kernel introduction aliases remove the added sm750hdmidrm.* GRUB options from betterment access. Testing and live reload guidance is successful Testing and recovery.

  • Hardware and capacity comparison
  • Module parameters
  • Modes and timepiece risks
  • Provenance and licensing audit
  • Testing and recovery
  • Manual CI build

The charismatic SM750 specification is known to beryllium incorrect for astatine slightest one hardware-observed partial-update boundary. Empirically verified workarounds are documented successful the root and must not beryllium removed solely because an perfect model or specification says they are unnecessary.

The task is GPL-2.0-only. DDK-derived files came from Linux's GPL-2.0 staging sm750fb driver. No proprietary Silicon Motion driver, binary object, firmware blob, aliases closed room is included aliases linked. See the provenance audit for details.

This task was created done extended AI-assisted aliases "vibe coding". I have specified and physically tested the behaviour and designed the civilization dither, but do not declare capable Linux DRM, KMS, DKMS, aliases kernel-framework expertise to independently guarantee each implementation detail. The root is published for reappraisal and improvement, not arsenic a declare of upstream kernel quality. Expert review is welcome.

YOU USE THIS EXPERIMENTAL DRIVER AND EVERY NON-EDID OR ABOVE-SPECIFICATION MODE ENTIRELY AT YOUR OWN RISK. YOU ARE RESPONSIBLE FOR RECOVERY ACCESS, BACKUPS, MODE SELECTION AND HARDWARE COMPATIBILITY. THE AUTHORS AND CONTRIBUTORS ARE NOT RESPONSIBLE FOR LOSS OF DISPLAY, DATA, TIME, HARDWARE, INCOME OR ANY OTHER DIRECT OR INDIRECT LOSS.

The package is provided without warranty. See LICENSE.

More